...
1
16
17 package util
18
19 import (
20 "path/filepath"
21
22 libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups"
23 libcontainerutils "github.com/opencontainers/runc/libcontainer/utils"
24 )
25
26 const (
27
28 CgroupRoot = "/sys/fs/cgroup"
29 )
30
31
32
33 func GetPids(cgroupPath string) ([]int, error) {
34 dir := ""
35
36 if libcontainercgroups.IsCgroup2UnifiedMode() {
37 path, err := filepath.Rel("/", cgroupPath)
38 if err != nil {
39 return nil, err
40 }
41 dir = filepath.Join(CgroupRoot, path)
42 } else {
43 var err error
44 dir, err = getCgroupV1Path(cgroupPath)
45 if err != nil {
46 return nil, err
47 }
48 }
49 return libcontainercgroups.GetPids(dir)
50 }
51
52
53
54 func getCgroupV1Path(cgroupPath string) (string, error) {
55 cgroupPath = libcontainerutils.CleanPath(cgroupPath)
56
57 mnt, root, err := libcontainercgroups.FindCgroupMountpointAndRoot(cgroupPath, "devices")
58
59 if err != nil {
60 return "", err
61 }
62
63
64 if filepath.IsAbs(cgroupPath) {
65
66 return filepath.Join(root, mnt, cgroupPath), nil
67 }
68
69 parentPath, err := getCgroupV1ParentPath(mnt, root)
70 if err != nil {
71 return "", err
72 }
73
74 return filepath.Join(parentPath, cgroupPath), nil
75 }
76
77
78 func getCgroupV1ParentPath(mountpoint, root string) (string, error) {
79
80
81
82 initPath, err := libcontainercgroups.GetOwnCgroup("devices")
83 if err != nil {
84 return "", err
85 }
86
87
88 relDir, err := filepath.Rel(root, initPath)
89 if err != nil {
90 return "", err
91 }
92 return filepath.Join(mountpoint, relDir), nil
93 }
94
View as plain text