cgroup_linux.go 746 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package cgroup
  2. import (
  3. "runtime"
  4. "github.com/vishvananda/netns"
  5. "golang.org/x/sys/unix"
  6. )
  7. func Init() error {
  8. selfNs, err := netns.GetFromPath("/proc/self/ns/cgroup")
  9. if err != nil {
  10. return err
  11. }
  12. defer selfNs.Close()
  13. hostNs, err := netns.GetFromPath("/proc/1/ns/cgroup")
  14. if err != nil {
  15. return err
  16. }
  17. defer hostNs.Close()
  18. if selfNs.Equal(hostNs) {
  19. return nil
  20. }
  21. runtime.LockOSThread()
  22. defer runtime.UnlockOSThread()
  23. if err := unix.Setns(int(hostNs), unix.CLONE_NEWCGROUP); err != nil {
  24. return err
  25. }
  26. cg, err := NewFromProcessCgroupFile("/proc/self/cgroup")
  27. if err != nil {
  28. return err
  29. }
  30. baseCgroupPath = cg.Id
  31. if err := unix.Setns(int(selfNs), unix.CLONE_NEWCGROUP); err != nil {
  32. return err
  33. }
  34. return nil
  35. }