]> git.proxmox.com Git - mirror_lxc.git/commitdiff
lxc-ps: handle cgroup collisions
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 8 May 2013 00:28:32 +0000 (19:28 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 8 May 2013 17:47:42 +0000 (12:47 -0500)
A few months ago cgroup handling in lxc was updated so that if
/sys/fs/cgroup/$cgroup/lxc/$container already exists (most often
due to another container by the same name under a different lxcpath),
then /sys/fs/cgroup/$cgroup/lxc/${container}-N would be used.

lxc-ps was never updated to handle this.  Fix that.

(Note, the ns cgroup is being special cased there, but I don't
really believe ns cgroup works any more.)

It would be preferable to rewrite lxc-ps in python or in C, but
this at least makes the basic lxc-ps work in the case of multiple
containers with the same name.

Changelog:
fix missing fi.
replace 'z1' with '$container' as pointed out by Christian

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/lxc-ps.in

index 55a05ce4802590a53b54c9edd3a17d0448c0b9e3..29e8097d931f5583e5bc7d0a667a7cd6d9e13824 100644 (file)
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
+. @DATADIR@/lxc/lxc.functions
+
 usage()
 {
-    echo "usage: $(basename $0) [--lxc | --host | --name NAME] [--] [PS_OPTIONS...]" >&2
+    echo "usage: $(basename $0) [-P PATH] [--lxc | --host | --name NAME] [[--] [PS_OPTIONS...]" >&2
 }
 
 help() {
@@ -31,6 +33,7 @@ help() {
     echo "  --host        show processes not related to any container, i.e. to the host" >&2
     echo "  --name NAME   show processes in the specified container" >&2
     echo "                 (multiple containers can be separated by commas)" >&2
+    echo "  -P PATH       show container in lxcpath PATH" >&2
     echo "  PS_OPTIONS    ps command options (see \`ps --help')" >&2
 }
 
@@ -65,7 +68,7 @@ get_parent_cgroup()
         # (do not append '/lxc' if the hierarchy contains the 'ns' subsystem)
         case ",$subsystems," in
             *,ns,*) parent_cgroup="${mountpoint}${init_cgroup%/}";;
-            *) parent_cgroup="${mountpoint}${init_cgroup%/}/lxc";;
+            *) parent_cgroup="${mountpoint}${init_cgroup%/}";;
         esac
         break
     done
@@ -83,6 +86,8 @@ while true; do
             list_container_processes=1; shift;;
         --host)
             list_container_processes=-1; shift;;
+        -P|--lxcpath)
+            lxc_path=$2; shift 2;;
         --)
             shift; break;;
         *)
@@ -111,8 +116,12 @@ for container in ${containers}; do
         container_field_width=${#container}
     fi
 
-    if [ -f "$parent_cgroup/$container/tasks" ]; then
-        tasks_files="$tasks_files $parent_cgroup/$container/tasks"
+    if lxc-info -P $lxc_path -t RUNNING -n $container; then
+        initpid=`lxc-info -P $lxc_path -p -n $container | awk -F: '{ print $2 }' | awk '{ print $1 }'`
+        cgroup=`head -n 1 /proc/$initpid/cgroup | awk -F: '{ print $3}'`
+        if [ -f "$parent_cgroup/$cgroup/tasks" ]; then
+            tasks_files="$tasks_files $parent_cgroup$cgroup/tasks"
+        fi
     fi
 done