pidof: allow to change a separator put between pids

I frequency use pidof command with strace system call tracer.
strace can trace MULTIPLE processes specified with "-p $PID"
arguments like:

	  strace -p 1 -p 1030 -p 3043

Sometimes I want to do as following

	  strace -p $(pidof httpd)

However, above command line doesn't work because -p option
is needed for specifying a pid. pidof uses a whitespace as
a separator. For passing the output to strace, the separator
should be replaced with ' -p '.

This maybe not a special to my use case.

This commit introduces -S option that allows a user to specify a
separator the one wants.

    $ ./pidof bash
    ./pidof bash
    24624 18790 12786 11898 11546 10766 7654 5095
    $ ./pidof -S ',' bash
    ./pidof -S ',' bash
    24624,18790,12786,11898,11546,10766,7654,5095
    $ ./pidof -S '-p ' bash
    ./pidof -S '-p ' bash
    24624-p 18790-p 12786-p 11898-p 11546-p 10766-p 7654-p 5095
    $ ./pidof -S ' -p ' bash
    ./pidof -S ' -p ' bash
    24624 -p 18790 -p 12786 -p 11898 -p 11546 -p 10766 -p 7654 -p 5095
    $ strace -p $(./pidof -S ' -p ' bash)
    strace -p $(./pidof -S ' -p ' bash)
    strace: Process 24624 attached
    strace: Process 18790 attached
    strace: Process 12786 attached
    ...

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
This commit is contained in:
Masatake YAMATO 2018-02-24 18:03:11 +09:00 committed by Craig Small
parent 1ddd17b17c
commit 7f5971058a
2 changed files with 13 additions and 2 deletions

View File

@ -27,6 +27,8 @@ pidof -- find the process ID of a running program.
.IR omitpid[,omitpid..] ] .IR omitpid[,omitpid..] ]
.RB [ \-o .RB [ \-o
.IR omitpid[,omitpid..].. ] .IR omitpid[,omitpid..].. ]
.RB [ \-S
.IR separator ]
.B program .B program
.RB [ program.. ] .RB [ program.. ]
.SH DESCRIPTION .SH DESCRIPTION
@ -47,6 +49,9 @@ shells running the named scripts.
Tells \fIpidof\fP to omit processes with that process id. The special Tells \fIpidof\fP to omit processes with that process id. The special
pid \fB%PPID\fP can be used to name the parent process of the \fIpidof\fP pid \fB%PPID\fP can be used to name the parent process of the \fIpidof\fP
program, in other words the calling shell or shell script. program, in other words the calling shell or shell script.
.IP "-S \fIseparator\fP"
Use \fIseparator\fP as a separator put between pids. Used only when
more than one pids are printed for the program.
.SH "EXIT STATUS" .SH "EXIT STATUS"
.TP .TP
.B 0 .B 0

10
pidof.c
View File

@ -65,6 +65,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
fputs(_(" -c, --check-root omit processes with different root\n"), fp); fputs(_(" -c, --check-root omit processes with different root\n"), fp);
fputs(_(" -x also find shells running the named scripts\n"), fp); fputs(_(" -x also find shells running the named scripts\n"), fp);
fputs(_(" -o, --omit-pid <PID,...> omit processes with PID\n"), fp); fputs(_(" -o, --omit-pid <PID,...> omit processes with PID\n"), fp);
fputs(_(" -S, --separator SEP use SEP as separator put between PIDs"), fp);
fputs(USAGE_SEPARATOR, fp); fputs(USAGE_SEPARATOR, fp);
fputs(USAGE_HELP, fp); fputs(USAGE_HELP, fp);
fputs(USAGE_VERSION, fp); fputs(USAGE_VERSION, fp);
@ -290,12 +291,14 @@ int main (int argc, char **argv)
int found = 0; int found = 0;
int first_pid = 1; int first_pid = 1;
const char *opts = "scnxmo:?Vh"; const char *separator = " ";
const char *opts = "scnxmo:S:?Vh";
static const struct option longopts[] = { static const struct option longopts[] = {
{"check-root", no_argument, NULL, 'c'}, {"check-root", no_argument, NULL, 'c'},
{"single-shot", no_argument, NULL, 's'}, {"single-shot", no_argument, NULL, 's'},
{"omit-pid", required_argument, NULL, 'o'}, {"omit-pid", required_argument, NULL, 'o'},
{"separator", required_argument, NULL, 's'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'}, {"version", no_argument, NULL, 'V'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
@ -327,6 +330,9 @@ int main (int argc, char **argv)
pidof_root = pid_link(getpid(), "root"); pidof_root = pid_link(getpid(), "root");
} }
break; break;
case 'S':
separator = optarg;
break;
case 'V': case 'V':
printf (PROCPS_NG_VERSION); printf (PROCPS_NG_VERSION);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
@ -360,7 +366,7 @@ int main (int argc, char **argv)
first_pid = 0; first_pid = 0;
printf ("%ld", (long) procs[i].pid); printf ("%ld", (long) procs[i].pid);
} else { } else {
printf (" %ld", (long) procs[i].pid); printf ("%s%ld", separator, (long) procs[i].pid);
} }
if (opt_single_shot) break; if (opt_single_shot) break;
} }