From 73492b182dc60c1605d1b0d62de651fad97807af Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sat, 24 Feb 2018 18:03:11 +0900 Subject: [PATCH] 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 --- pidof.1 | 5 +++++ pidof.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pidof.1 b/pidof.1 index f49cd234..15b40317 100644 --- a/pidof.1 +++ b/pidof.1 @@ -27,6 +27,8 @@ pidof -- find the process ID of a running program. .IR omitpid[,omitpid..] ] .RB [ \-o .IR omitpid[,omitpid..].. ] +.RB [ \-S +.IR separator ] .B program .RB [ program.. ] .SH DESCRIPTION @@ -47,6 +49,9 @@ shells running the named scripts. 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 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" .TP .B 0 diff --git a/pidof.c b/pidof.c index 01f0c0a1..8159147d 100644 --- a/pidof.c +++ b/pidof.c @@ -64,6 +64,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt) fputs(_(" -c, --check-root omit processes with different root\n"), fp); fputs(_(" -x also find shells running the named scripts\n"), fp); fputs(_(" -o, --omit-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_HELP, fp); fputs(USAGE_VERSION, fp); @@ -287,12 +288,14 @@ int main (int argc, char **argv) int found = 0; int first_pid = 1; - const char *opts = "scnxmo:?Vh"; + const char *separator = " "; + const char *opts = "scnxmo:S:?Vh"; static const struct option longopts[] = { {"check-root", no_argument, NULL, 'c'}, {"single-shot", no_argument, NULL, 's'}, {"omit-pid", required_argument, NULL, 'o'}, + {"separator", required_argument, NULL, 's'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {NULL, 0, NULL, 0} @@ -324,6 +327,9 @@ int main (int argc, char **argv) pidof_root = pid_link(getpid(), "root"); } break; + case 'S': + separator = optarg; + break; case 'V': printf (PROCPS_NG_VERSION); exit (EXIT_SUCCESS); @@ -357,7 +363,7 @@ int main (int argc, char **argv) first_pid = 0; printf ("%ld", (long) procs[i].pid); } else { - printf (" %ld", (long) procs[i].pid); + printf ("%s%ld", separator, (long) procs[i].pid); } if (opt_single_shot) break; }