From 6bc22a379fca654230e5805885266966316b570c Mon Sep 17 00:00:00 2001 From: Craig Small Date: Tue, 24 Nov 2009 11:00:45 +0100 Subject: [PATCH] pgrep: add -c option for counting number of matched proceesses A patch from Debian. Bug-Debian: http://bugs.debian.org/375791 Backported-by: Sami Kerola --- pgrep.1 | 4 +++- pgrep.c | 20 ++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pgrep.1 b/pgrep.1 index eba694bb..c933b8fe 100644 --- 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 eec7ac27..1c7f41a5 100644 --- 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) }