mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-03-01 18:43:55 +02:00
This behavior was depended on in our trap_sigpipe_or_skip_ helper, and now that we're handling all terminating signals, we should consistently honor their ignored signal dispositions. * NEWS: Mention the change in behavior, especially in regard to shell background jobs. * src/timeout.c (sig_needs_handling): A new helper that return TRUE, for --signal, SIG_ALRM, or non ignored signals. (cleanup_install): Filter handled signals with the helper. (block_cleanup_and_chld): Likewise. * tests/timeout/timeout-group.sh: Adjust to use the now required `env --default-signal=...` wrapper to reset (auto) ignored signals. Also change the termination signal from SIGINT to SIGUSR1 to generalize the test signals not specially handled by the shell, and newly handled by timeout(1). * tests/timeout/timeout.sh: Add a test case for SIGPIPE to ensure the ignored signal disposition is honored.
86 lines
2.7 KiB
Bash
Executable File
86 lines
2.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# Validate timeout basic operation
|
|
|
|
# Copyright (C) 2008-2025 Free Software Foundation, Inc.
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
print_ver_ timeout kill
|
|
require_trap_signame_
|
|
|
|
# no timeout
|
|
timeout 10 true || fail=1
|
|
|
|
# no timeout (suffix check)
|
|
timeout 1d true || fail=1
|
|
|
|
# disabled timeout
|
|
timeout 0 true || fail=1
|
|
|
|
# exit status propagation
|
|
returns_ 2 timeout 10 sh -c 'exit 2' || fail=1
|
|
|
|
# timeout
|
|
returns_ 124 timeout .1 sleep 10 || fail=1
|
|
|
|
# exit status propagation even on timeout
|
|
# exit status should be 128+TERM
|
|
returns_ 124 timeout --preserve-status .1 sleep 10 && fail=1
|
|
|
|
# kill delay. Note once the initial timeout triggers,
|
|
# the exit status will be 124 even if the command
|
|
# exits on its own accord.
|
|
# exit status should be 128+KILL
|
|
returns_ 124 timeout -s0 -k1 .1 sleep 10 && fail=1
|
|
# Ensure a consistent exit status with --foreground
|
|
returns_ 124 timeout --foreground -s0 -k1 .1 sleep 10 && fail=1
|
|
|
|
# Ensure 'timeout' is immune to parent's SIGCHLD handler
|
|
# Use a subshell and an exec to work around a bug in FreeBSD 5.0 /bin/sh.
|
|
(
|
|
trap '' CHLD
|
|
|
|
exec timeout 10 true
|
|
) || fail=1
|
|
|
|
# Don't be confused when starting off with a child (Bug#9098).
|
|
out=$(sleep .1 & exec timeout .5 sh -c 'sleep 2; echo foo')
|
|
status=$?
|
|
test "$out" = "" && test $status = 124 || fail=1
|
|
|
|
# Verify --verbose output
|
|
cat > exp <<\EOF
|
|
timeout: sending signal EXIT to command 'sleep'
|
|
timeout: sending signal KILL to command 'sleep'
|
|
EOF
|
|
for opt in -v --verbose; do
|
|
timeout $opt -s0 -k .1 .1 sleep 10 2> errt
|
|
sed '/^Killed/d' < errt > err || framework_failure_
|
|
compare exp err || fail=1
|
|
done
|
|
|
|
# Ensure we propagate all terminating signals.
|
|
# Specifically here we're testing that SIGPIPE is handled.
|
|
# I.e., that we're not killed by the SIGPIPE (and leave the sleep running).
|
|
# timeout would exit with 141 usually if SIGPIPE wasn't being handled.
|
|
echo 125 > timeout.exp || framework_failure_
|
|
{ timeout -v .1 sleep 10 2>&1; echo $? >timeout.status; } | :
|
|
compare timeout.exp timeout.status || fail=1
|
|
# Ensure we don't catch/propagate ignored signals
|
|
(trap '' PIPE && timeout 10 yes |:) 2>&1 |
|
|
grep 'Broken pipe' >/dev/null || fail=1
|
|
|
|
Exit $fail
|