pgrep: Use only --signal option for signal
When pgrep was used to match on signal, it makes sense to use
the same signal parsing code as pkill. Unfortunately the
"find the signal" part is a little too enthusaistic about what a
signal is, meaning
pgrep -u -42
fails because the signal becomes "42" and then there is no UID.
This is a bit sad for pkill but has been that way for a long
time. For pgrep this is new so now only the long form
pgrep --signal <X>
will work.
In addition, when using --signal if pgrep/pkill couldn't work
out what the signal was it just silently ignored it. It now
complains and aborts.
References:
https://bugs.debian.org/1031765
commit 866abacf88
This commit is contained in:
parent
9b2f49166b
commit
8c81808de0
1
NEWS
1
NEWS
@ -1,5 +1,6 @@
|
|||||||
procps-ng-NEXT
|
procps-ng-NEXT
|
||||||
---------------
|
---------------
|
||||||
|
* pgrep: Use only --signal option for signal Debian #1031765
|
||||||
* tests: dont compare floats with == issue #271
|
* tests: dont compare floats with == issue #271
|
||||||
|
|
||||||
procps-ng-4.0.3
|
procps-ng-4.0.3
|
||||||
|
@ -60,7 +60,7 @@ the symbolic signal name can be used. In
|
|||||||
.B pgrep
|
.B pgrep
|
||||||
or
|
or
|
||||||
.B pidwait
|
.B pidwait
|
||||||
mode this has no effect unless used in conjunction with
|
mode only the long option can be used and has no effect unless used in conjunction with
|
||||||
\fB\-\-require\-handler\fR to filter to processes with a userspace signal
|
\fB\-\-require\-handler\fR to filter to processes with a userspace signal
|
||||||
handler present for a particular signal.
|
handler present for a particular signal.
|
||||||
|
|
||||||
|
21
src/pgrep.c
21
src/pgrep.c
@ -163,6 +163,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
|
|||||||
fputs(_(" -w, --lightweight list all TID\n"), fp);
|
fputs(_(" -w, --lightweight list all TID\n"), fp);
|
||||||
break;
|
break;
|
||||||
case PKILL:
|
case PKILL:
|
||||||
|
fputs(_(" -<sig> signal to send (either number or name)\n"), fp);
|
||||||
fputs(_(" -H, --require-handler match only if signal handler is present\n"), fp);
|
fputs(_(" -H, --require-handler match only if signal handler is present\n"), fp);
|
||||||
fputs(_(" -q, --queue <value> integer value to be sent with the signal\n"), fp);
|
fputs(_(" -q, --queue <value> integer value to be sent with the signal\n"), fp);
|
||||||
fputs(_(" -e, --echo display what is killed\n"), fp);
|
fputs(_(" -e, --echo display what is killed\n"), fp);
|
||||||
@ -173,7 +174,6 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
fputs(_(" -<sig>, --signal <sig> signal to send (either number or name)\n"), fp);
|
|
||||||
fputs(_(" -c, --count count of matching processes\n"), fp);
|
fputs(_(" -c, --count count of matching processes\n"), fp);
|
||||||
fputs(_(" -f, --full use full process name to match\n"), fp);
|
fputs(_(" -f, --full use full process name to match\n"), fp);
|
||||||
fputs(_(" -g, --pgroup <PGID,...> match listed process group IDs\n"), fp);
|
fputs(_(" -g, --pgroup <PGID,...> match listed process group IDs\n"), fp);
|
||||||
@ -184,6 +184,7 @@ static int __attribute__ ((__noreturn__)) usage(int opt)
|
|||||||
fputs(_(" -O, --older <seconds> select where older than seconds\n"), fp);
|
fputs(_(" -O, --older <seconds> select where older than seconds\n"), fp);
|
||||||
fputs(_(" -P, --parent <PPID,...> match only child processes of the given parent\n"), fp);
|
fputs(_(" -P, --parent <PPID,...> match only child processes of the given parent\n"), fp);
|
||||||
fputs(_(" -s, --session <SID,...> match session IDs\n"), fp);
|
fputs(_(" -s, --session <SID,...> match session IDs\n"), fp);
|
||||||
|
fputs(_(" --signal <sig> signal to send (either number or name)\n"), fp);
|
||||||
fputs(_(" -t, --terminal <tty,...> match by controlling terminal\n"), fp);
|
fputs(_(" -t, --terminal <tty,...> match by controlling terminal\n"), fp);
|
||||||
fputs(_(" -u, --euid <ID,...> match by effective IDs\n"), fp);
|
fputs(_(" -u, --euid <ID,...> match by effective IDs\n"), fp);
|
||||||
fputs(_(" -U, --uid <ID,...> match by real IDs\n"), fp);
|
fputs(_(" -U, --uid <ID,...> match by real IDs\n"), fp);
|
||||||
@ -823,7 +824,6 @@ static int pidfd_open (pid_t pid, unsigned int flags)
|
|||||||
static void parse_opts (int argc, char **argv)
|
static void parse_opts (int argc, char **argv)
|
||||||
{
|
{
|
||||||
char opts[64] = "";
|
char opts[64] = "";
|
||||||
int sig;
|
|
||||||
int opt;
|
int opt;
|
||||||
int criteria_count = 0;
|
int criteria_count = 0;
|
||||||
|
|
||||||
@ -869,9 +869,6 @@ static void parse_opts (int argc, char **argv)
|
|||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
sig = signal_option(&argc, argv);
|
|
||||||
if (-1 < sig)
|
|
||||||
opt_signal = sig;
|
|
||||||
|
|
||||||
#ifdef ENABLE_PIDWAIT
|
#ifdef ENABLE_PIDWAIT
|
||||||
if (strcmp (program_invocation_short_name, "pidwait") == 0 ||
|
if (strcmp (program_invocation_short_name, "pidwait") == 0 ||
|
||||||
@ -882,7 +879,11 @@ static void parse_opts (int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
if (strcmp (program_invocation_short_name, "pkill") == 0 ||
|
if (strcmp (program_invocation_short_name, "pkill") == 0 ||
|
||||||
strcmp (program_invocation_short_name, "lt-pkill") == 0) {
|
strcmp (program_invocation_short_name, "lt-pkill") == 0) {
|
||||||
|
int sig;
|
||||||
prog_mode = PKILL;
|
prog_mode = PKILL;
|
||||||
|
sig = signal_option(&argc, argv);
|
||||||
|
if (-1 < sig)
|
||||||
|
opt_signal = sig;
|
||||||
strcat (opts, "eq:");
|
strcat (opts, "eq:");
|
||||||
} else {
|
} else {
|
||||||
strcat (opts, "lad:vw");
|
strcat (opts, "lad:vw");
|
||||||
@ -895,8 +896,14 @@ static void parse_opts (int argc, char **argv)
|
|||||||
switch (opt) {
|
switch (opt) {
|
||||||
case SIGNAL_OPTION:
|
case SIGNAL_OPTION:
|
||||||
opt_signal = signal_name_to_number (optarg);
|
opt_signal = signal_name_to_number (optarg);
|
||||||
if (opt_signal == -1 && isdigit (optarg[0]))
|
if (opt_signal == -1) {
|
||||||
opt_signal = atoi (optarg);
|
if (isdigit (optarg[0]))
|
||||||
|
opt_signal = atoi (optarg);
|
||||||
|
else {
|
||||||
|
fprintf(stderr, _("Unknown signal \"%s\"."), optarg);
|
||||||
|
usage('?');
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
opt_echo = 1;
|
opt_echo = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user