2011-11-27 15:30:04 +11:00
|
|
|
#
|
|
|
|
# Dejagnu tests for pgrep - part of procps
|
|
|
|
#
|
|
|
|
set mypid [pid]
|
|
|
|
set not_ppid [ expr { $mypid + 1 } ]
|
2022-08-29 19:13:10 +10:00
|
|
|
set pgrep "${topdir}src/pgrep"
|
2011-11-27 15:30:04 +11:00
|
|
|
set uid [ exec id -u ]
|
|
|
|
set not_uid [ expr { $uid + 1 } ]
|
|
|
|
set gid [ exec id -g ]
|
|
|
|
set not_gid [ expr { $gid + 1 } ]
|
2022-08-29 19:13:10 +10:00
|
|
|
set ps "${topdir}src/ps/pscommand"
|
2015-05-09 17:48:12 +10:00
|
|
|
set tty [ get_tty ]
|
2011-11-27 15:30:04 +11:00
|
|
|
|
2013-10-09 19:18:55 +11:00
|
|
|
set test "pgprep with no arguments"
|
|
|
|
spawn $pgrep
|
|
|
|
expect_pass "$test" "^\(lt-\)\?pgrep: no matching criteria specified\\s*"
|
|
|
|
|
2011-11-30 23:11:35 +11:00
|
|
|
make_testproc
|
|
|
|
|
|
|
|
set testproc_len [ string length $testproc_comm ]
|
|
|
|
set testproc_trim [ string range $testproc_comm 0 [ expr { $testproc_len - 2 } ] ]
|
2012-06-27 23:21:50 +02:00
|
|
|
set testproc1_sid [ string trim [ exec $ps --no-headers -o sid $testproc1_pid ] ]
|
pgrep: Support matching on the presence of a userspace signal handler
In production we've had several incidents over the years where a process
has a signal handler registered for SIGHUP or one of the SIGUSR signals
which can be used to signal a request to reload configs, rotate log
files, and the like. While this may seem harmless enough, what we've
seen happen repeatedly is something like the following:
1. A process is using SIGHUP/SIGUSR[12] to request some
application-handled state change -- reloading configs, rotating a log
file, etc;
2. This kind of request is deprecated and removed, so the signal handler
is removed. However, a site where the signal might be sent from is
missed (often logrotate or a service manager);
3. Because the default disposition of these signals is terminal, sooner
or later these applications are going to be sent SIGHUP or similar
and end up unexpectedly killed.
I know for a fact that we're not the only organisation experiencing
this: in general, signal use is pretty tricky to reason about and safely
remove because of the fairly aggressive SIG_DFL behaviour for some
common signals, especially for SIGHUP which has a particularly ambiguous
meaning. Especially in a large, highly interconnected codebase,
reasoning about signal interactions between system configuration and
applications can be highly complex, and it's inevitable that on occasion
a callsite will be missed.
In some cases the right call to avoid this will be to migrate services
towards other forms of IPC for this purpose, but inevitably there will
be some services which must continue using signals, so we need a safe
way to support them.
This patch adds support for the -H/--require-handler flag, which matches
on processes with a userspace handler present for the signal being sent.
With this flag we can enforce that all SIGHUP reload cases and SIGUSR
equivalents use --require-handler. This effectively mitigates the case
we've seen time and time again where SIGHUP is used to rotate log files
or reload configs, but the sending site is mistakenly left present after
the removal of signal handler, resulting in unintended termination of
the process.
Signed-off-by: Chris Down <chris@chrisdown.name>
2022-11-01 00:17:21 +00:00
|
|
|
set not_testproc1_sid [ expr { $testproc1_sid + 1 } ]
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep find both test pids"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
# In Debian only
|
2015-06-13 15:04:31 +10:00
|
|
|
set test "pgrep counts 2 test pids"
|
|
|
|
spawn $pgrep -c $testproc_comm
|
|
|
|
expect_pass "$test" "^2\\s*"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep with : delimiter"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -d : $testproc_comm
|
|
|
|
expect_pass "$test" "^${testproc1_pid}:${testproc2_pid}\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
2011-11-29 22:55:03 +11:00
|
|
|
set test "pgrep match against full process name"
|
2019-08-03 05:58:18 -04:00
|
|
|
spawn $pgrep -f "$testproc_path\\s+$testproc_arg_str"
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep with matching gid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -G $gid $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep with not matching gid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -G $not_gid $testproc_comm
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank $test
|
|
|
|
|
|
|
|
set test "pgrep with process name"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -l $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc_comm\\s+$testproc2_pid\\s+$testproc_comm\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
2012-08-18 02:20:27 +02:00
|
|
|
set test "pgrep with full command line"
|
2019-08-03 05:58:18 -04:00
|
|
|
spawn $pgrep -af "$testproc_path$"
|
|
|
|
expect_pass "$test" "^$testproc2_pid\\s+$testproc_path\\s*$"
|
2012-08-18 02:20:27 +02:00
|
|
|
|
2011-11-27 15:30:04 +11:00
|
|
|
set test "pgrep find newest test pid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -n $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep find oldest test pid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -o $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep matches with parent pid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -P $mypid $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep doesn't match with bogus parent pid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -P $not_ppid $testproc_comm
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank "$test"
|
|
|
|
|
|
|
|
set test "pgrep matches with its own sid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -s $testproc1_sid $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep doesn't match with bogus sid"
|
pgrep: Support matching on the presence of a userspace signal handler
In production we've had several incidents over the years where a process
has a signal handler registered for SIGHUP or one of the SIGUSR signals
which can be used to signal a request to reload configs, rotate log
files, and the like. While this may seem harmless enough, what we've
seen happen repeatedly is something like the following:
1. A process is using SIGHUP/SIGUSR[12] to request some
application-handled state change -- reloading configs, rotating a log
file, etc;
2. This kind of request is deprecated and removed, so the signal handler
is removed. However, a site where the signal might be sent from is
missed (often logrotate or a service manager);
3. Because the default disposition of these signals is terminal, sooner
or later these applications are going to be sent SIGHUP or similar
and end up unexpectedly killed.
I know for a fact that we're not the only organisation experiencing
this: in general, signal use is pretty tricky to reason about and safely
remove because of the fairly aggressive SIG_DFL behaviour for some
common signals, especially for SIGHUP which has a particularly ambiguous
meaning. Especially in a large, highly interconnected codebase,
reasoning about signal interactions between system configuration and
applications can be highly complex, and it's inevitable that on occasion
a callsite will be missed.
In some cases the right call to avoid this will be to migrate services
towards other forms of IPC for this purpose, but inevitably there will
be some services which must continue using signals, so we need a safe
way to support them.
This patch adds support for the -H/--require-handler flag, which matches
on processes with a userspace handler present for the signal being sent.
With this flag we can enforce that all SIGHUP reload cases and SIGUSR
equivalents use --require-handler. This effectively mitigates the case
we've seen time and time again where SIGHUP is used to rotate log files
or reload configs, but the sending site is mistakenly left present after
the removal of signal handler, resulting in unintended termination of
the process.
Signed-off-by: Chris Down <chris@chrisdown.name>
2022-11-01 00:17:21 +00:00
|
|
|
spawn $pgrep -s $not_testproc1_sid $testproc_comm
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank "$test"
|
|
|
|
|
|
|
|
set test "pgrep matches on tty"
|
2015-05-09 17:48:12 +10:00
|
|
|
if { $tty == "" } {
|
|
|
|
untested "$test"
|
|
|
|
} else {
|
|
|
|
spawn $pgrep -t $tty $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
|
|
|
}
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep doesn't match with bogus tty"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -t glass $testproc_comm
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank "$test"
|
|
|
|
|
|
|
|
set test "pgrep with matching euid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -u $uid $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep with not matching euid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -u $not_uid $testproc_comm
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank $test
|
|
|
|
|
|
|
|
set test "pgrep with matching uid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -U $uid $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep with not matching uid"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -U $not_uid $testproc_comm
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank $test
|
|
|
|
|
|
|
|
set test "pgrep matches on substring"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep $testproc_trim
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep matches full string with exact"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -x $testproc_comm
|
|
|
|
expect_pass "$test" "^$testproc1_pid\\s+$testproc2_pid\\s*$"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
set test "pgrep does not match substring with exact"
|
2011-11-30 23:11:35 +11:00
|
|
|
spawn $pgrep -x $testproc_trim
|
2011-11-27 15:30:04 +11:00
|
|
|
expect_blank $test
|
|
|
|
|
2017-01-26 16:52:23 +11:00
|
|
|
set test "pgrep with long non-matching pattern gives warning"
|
2016-09-11 10:40:47 +10:00
|
|
|
spawn $pgrep gnome-session-bi
|
2017-01-26 16:52:23 +11:00
|
|
|
expect_pass "$test" "pattern that searches for process name longer than 15 characters will result in zero matches"
|
2011-11-27 15:30:04 +11:00
|
|
|
|
|
|
|
# Cleanup
|
2014-07-01 18:51:21 +10:00
|
|
|
kill_testproc
|