]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
cgtop: add option to show a single cgroup subtree (#3413)
authorAlessandro Puccetti <alessandro@kinvolk.io>
Sun, 5 Jun 2016 17:42:37 +0000 (19:42 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 5 Jun 2016 17:42:37 +0000 (13:42 -0400)
When many services are running, it was difficult to see only the interesting ones.
This patch allows to show only the subtree of interest.

man/systemd-cgtop.xml
src/cgtop/cgtop.c

index c76f6469843fe4da091a5c071621363994252dda..be13631239d8d309ad931b402113de14c0200c59 100644 (file)
@@ -52,6 +52,7 @@
     <cmdsynopsis>
       <command>systemd-cgtop</command>
       <arg choice="opt" rep="repeat">OPTIONS</arg>
+      <arg choice="opt">GROUP</arg>
     </cmdsynopsis>
   </refsynopsisdiv>
 
@@ -62,7 +63,9 @@
     groups of the local Linux control group hierarchy, ordered by
     their CPU, memory, or disk I/O load. The display is refreshed in
     regular intervals (by default every 1s), similar in style to
-    <citerefentry project='man-pages'><refentrytitle>top</refentrytitle><manvolnum>1</manvolnum></citerefentry>.</para>
+    <citerefentry project='man-pages'><refentrytitle>top</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
+    If a control group path is specified, shows only the services of
+    the specified control group.</para>
 
     <para>If <command>systemd-cgtop</command> is not connected to a
     tty, no column headers are printed and the default is to only run
 
         <listitem><para>Limit control groups shown to the part
         corresponding to the container
-        <replaceable>MACHINE</replaceable>.</para></listitem>
+        <replaceable>MACHINE</replaceable>.
+        This option may not be used when a control group path is specified.</para></listitem>
       </varlistentry>
 
       <xi:include href="standard-options.xml" xpointer="help" />
index 33379eb9bd02ad09116528bd35b963045e5d2de3..b4a982ce38300bc41a02d23f6ba9e217ed66e4d7 100644 (file)
@@ -72,6 +72,7 @@ static bool arg_batch = false;
 static bool arg_raw = false;
 static usec_t arg_delay = 1*USEC_PER_SEC;
 static char* arg_machine = NULL;
+static char* arg_root = NULL;
 static bool arg_recursive = true;
 
 static enum {
@@ -653,7 +654,7 @@ static void display(Hashmap *a) {
 }
 
 static void help(void) {
-        printf("%s [OPTIONS...]\n\n"
+        printf("%s [OPTIONS...] [CGROUP]\n\n"
                "Show top control groups by their resource usage.\n\n"
                "  -h --help           Show this help\n"
                "     --version        Show package version\n"
@@ -835,7 +836,13 @@ static int parse_argv(int argc, char *argv[]) {
                         assert_not_reached("Unhandled option");
                 }
 
-        if (optind < argc) {
+        if (optind == argc-1) {
+                if (arg_machine) {
+                        log_error("Specifying a control group path together with the -M option is not allowed");
+                        return -EINVAL;
+                }
+                arg_root = argv[optind];
+        } else if (optind < argc) {
                 log_error("Too many arguments.");
                 return -EINVAL;
         }
@@ -864,6 +871,13 @@ static int get_cgroup_root(char **ret) {
         const char *m;
         int r;
 
+        if (arg_root) {
+                *ret = strdup(arg_root);
+                if (!*ret)
+                        return log_oom();
+                return 0;
+        }
+
         if (!arg_machine) {
                 r = cg_get_root_path(ret);
                 if (r < 0)