12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- package cgroups
- import (
- "bufio"
- "io"
- "os"
- "strings"
- "github.com/dotcloud/docker/pkg/mount"
- )
- // https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
- func FindCgroupMountpoint(subsystem string) (string, error) {
- mounts, err := mount.GetMounts()
- if err != nil {
- return "", err
- }
- for _, mount := range mounts {
- if mount.Fstype == "cgroup" {
- for _, opt := range strings.Split(mount.VfsOpts, ",") {
- if opt == subsystem {
- return mount.Mountpoint, nil
- }
- }
- }
- }
- return "", ErrNotFound
- }
- // Returns the relative path to the cgroup docker is running in.
- func GetThisCgroupDir(subsystem string) (string, error) {
- f, err := os.Open("/proc/self/cgroup")
- if err != nil {
- return "", err
- }
- defer f.Close()
- return parseCgroupFile(subsystem, f)
- }
- func GetInitCgroupDir(subsystem string) (string, error) {
- f, err := os.Open("/proc/1/cgroup")
- if err != nil {
- return "", err
- }
- defer f.Close()
- return parseCgroupFile(subsystem, f)
- }
- func parseCgroupFile(subsystem string, r io.Reader) (string, error) {
- s := bufio.NewScanner(r)
- for s.Scan() {
- if err := s.Err(); err != nil {
- return "", err
- }
- text := s.Text()
- parts := strings.Split(text, ":")
- for _, subs := range strings.Split(parts[1], ",") {
- if subs == subsystem {
- return parts[2], nil
- }
- }
- }
- return "", ErrNotFound
- }
|