summaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container_top.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/libpod/container_top.go b/libpod/container_top.go
new file mode 100644
index 000000000..7d6dad2b4
--- /dev/null
+++ b/libpod/container_top.go
@@ -0,0 +1,57 @@
+package libpod
+
+import (
+ "fmt"
+ "io/ioutil"
+ "path/filepath"
+ "strings"
+
+ "github.com/pkg/errors"
+ "github.com/projectatomic/libpod/utils"
+ "github.com/sirupsen/logrus"
+)
+
+// GetContainerPids reads sysfs to obtain the pids associated with the container's cgroup
+// and uses locking
+func (c *Container) GetContainerPids() ([]string, error) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ if err := c.syncContainer(); err != nil {
+ return []string{}, errors.Wrapf(err, "error updating container %s state", c.ID())
+ }
+ return c.getContainerPids()
+}
+
+// Gets the pids for a container without locking. should only be called from a func where
+// locking has already been established.
+func (c *Container) getContainerPids() ([]string, error) {
+ taskFile := filepath.Join("/sys/fs/cgroup/pids", CGroupParent, fmt.Sprintf("libpod-conmon-%s", c.ID()), c.ID(), "tasks")
+ logrus.Debug("reading pids from ", taskFile)
+ content, err := ioutil.ReadFile(taskFile)
+ if err != nil {
+ return []string{}, errors.Wrapf(err, "unable to read pids from %s", taskFile)
+ }
+ return strings.Fields(string(content)), nil
+
+}
+
+// GetContainerPidInformation calls ps with the appropriate options and returns
+// the results as a string
+func (c *Container) GetContainerPidInformation(args []string) ([]string, error) {
+ c.lock.Lock()
+ defer c.lock.Unlock()
+ if err := c.syncContainer(); err != nil {
+ return []string{}, errors.Wrapf(err, "error updating container %s state", c.ID())
+ }
+ pids, err := c.getContainerPids()
+ if err != nil {
+ return []string{}, errors.Wrapf(err, "unable to obtain pids for ", c.ID())
+ }
+ args = append(args, "-p", strings.Join(pids, ","))
+ logrus.Debug("Executing: ", strings.Join(args, " "))
+ results, err := utils.ExecCmd("ps", args...)
+ if err != nil {
+ return []string{}, errors.Wrapf(err, "unable to obtain information about pids")
+ }
+ return strings.Split(results, "\n"), nil
+}