]> granicus.if.org Git - procps-ng/commitdiff
pgrep: add -c option for counting number of matched proceesses
authorCraig Small <csmall@debian.org>
Tue, 24 Nov 2009 10:00:45 +0000 (11:00 +0100)
committerCraig Small <csmall@enc.com.au>
Sun, 18 Dec 2011 11:30:41 +0000 (22:30 +1100)
A patch from Debian.

Bug-Debian: http://bugs.debian.org/375791
Backported-by: Sami Kerola <kerolasa@iki.fi>
pgrep.1
pgrep.c

diff --git a/pgrep.1 b/pgrep.1
index eba694bbc11d73447257b7fe1ce0d30b94e42450..c933b8febbb052e8caba166ed442755f04703884 100644 (file)
--- a/pgrep.1
+++ b/pgrep.1
@@ -8,7 +8,7 @@ pgrep, pkill \- look up or signal processes based on name and other attributes
 
 .SH SYNOPSIS
 .na
-\fBpgrep\fR [\fB\-flvx\fR] [\fB\-d\ \fIdelimiter\fR] [\fB\-n\fR|\fB\-o\fR] \
+\fBpgrep\fR [\fB\-cflvx\fR] [\fB\-d\ \fIdelimiter\fR] [\fB\-n\fR|\fB\-o\fR] \
 [\fB\-P\ \fIppid\fR,...] [\fB\-g\ \fIpgrp\fR,...] [\fB\-s\ \fIsid\fR,...] \
 [\fB\-u\ \fIeuid\fR,...] [\fB\-U\ \fIuid\fR,...] [\fB\-G\ \fIgid\fR,...] \
 [\fB\-t\ \fIterm\fR,...] [\fIpattern\fR]
@@ -41,6 +41,8 @@ will list the processes owned by \fBroot\fP OR \fBdaemon\fP.
 to each process instead of listing them on stdout.
 
 .SH OPTIONS
+\-c
+Suppress normal output; instead print a count of matching processes.
 .TP
 \fB\-d \fIdelimiter\fP
 Sets the string used to delimit each process ID in the output (by
diff --git a/pgrep.c b/pgrep.c
index eec7ac27daeda7abf12f4041765fb2343863110b..1c7f41a55fe7d15287b0a471ba67e74c7afc213a 100644 (file)
--- a/pgrep.c
+++ b/pgrep.c
@@ -54,6 +54,7 @@ static int opt_oldest = 0;
 static int opt_newest = 0;
 static int opt_negate = 0;
 static int opt_exact = 0;
+static int opt_count = 0;
 static int opt_signal = SIGTERM;
 static int opt_lock = 0;
 static int opt_case = 0;
@@ -79,7 +80,7 @@ static int usage (int opt)
        if (i_am_pkill)
                fprintf (fp, "Usage: pkill [-SIGNAL] [-fvx] ");
        else
-               fprintf (fp, "Usage: pgrep [-flvx] [-d DELIM] ");
+               fprintf (fp, "Usage: pgrep [-cflvx] [-d DELIM] ");
        fprintf (fp, "[-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]\n"
                 "\t[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] "
                 "[PATTERN]\n");
@@ -567,7 +568,7 @@ static void parse_opts (int argc, char **argv)
                strcat (opts, "ld:");
        }
                        
-       strcat (opts, "LF:fnovxP:g:s:u:U:G:t:?V");
+       strcat (opts, "LF:cfnovxP:g:s:u:U:G:t:?V");
        
        while ((opt = getopt (argc, argv, opts)) != -1) {
                switch (opt) {
@@ -615,6 +616,9 @@ static void parse_opts (int argc, char **argv)
                        exit(EXIT_SUCCESS);
 //             case 'c':   // Solaris: match by contract ID
 //                     break;
+               case 'c':
+                       opt_count = 1;
+                       break;
                case 'd':   // Solaris: change the delimiter
                        opt_delim = strdup (optarg);
                        break;
@@ -726,10 +730,14 @@ int main (int argc, char *argv[])
                                 procs[i].num, strerror (errno));
                }
        } else {
-               if (opt_long)
-                       output_strlist(procs,num);
-               else
-                       output_numlist(procs,num);
+               if (opt_count) {
+                       fprintf(stdout, "%ld\n", num);
+               } else {
+                       if (opt_long)
+                               output_strlist (procs,num);
+                       else
+                               output_numlist (procs,num);
+               }
        }
        return !num; // exit(EXIT_SUCCESS) if match, otherwise exit(EXIT_FAILURE)
 }