Here's a script that generates a script that will try to catch all signals. The script it generates (sigcatcher.sh
) outputs the name of the caught signal before exiting.
#!/bin/sh
# generate a shell function for each and every available signal.
/bin/kill -l | tr ' ' '\n' |
while read signal; do
cat <<END_OF_FUNCTION
handle_$signal () {
echo "Caught $signal"
exit
}
trap 'handle_$signal' $signal
END_OF_FUNCTION
done >sigcatcher.sh
echo 'echo "$$"; sleep 600' >>sigcatcher.sh
On my system (OpenBSD), /bin/kill -l
generates a list of available signals on one line, that's why the tr
is there to break it up.
The generated script will look something like this:
handle_HUP () {
echo "Caught HUP"
exit
}
trap 'handle_HUP' HUP
handle_INT () {
echo "Caught INT"
exit
}
trap 'handle_INT' INT
(etc.)
And it will be finished off with
echo "$$"; sleep 600
It outputs its PID and sleeps for 10 minutes.
You run it like this:
$ sh ./sigcatcher.sh >sigcatcher.out
Then you close the window, and then you inspect sigcatcher.out
.
I don't run X Windows, but when I kill the tmux
pane that this script is running in, I get "Caught HUP" in the output file.
strace
? – Wildcard Oct 08 '15 at 01:32SIGHUP
; howeverSIGHUP
is what I see when testing this. Lacking a script to demonstrate the problem, there's nothing to test. – Thomas Dickey Oct 16 '16 at 20:21