【发布时间】:2016-01-19 07:45:35
【问题描述】:
我有一个在前台运行一个长时间运行的进程的 Bash 脚本。当它接收到 SIGQUIT 信号时,它应该执行各种清理操作,例如杀死自己及其所有子进程(通过杀死进程组等)。下面显示了一个应该捕获信号的最小脚本(称为test_trap.sh):
#!/bin/bash
trap 'echo "TRAP CAUGHT"; exit 1' QUIT # other required signals are omitted for brevity
echo starting sleep
sleep 11666
echo ending sleep
echo done
我想将 SIGHUP 信号发送到test_trap.sh 脚本的进程。但是,向test_trap.sh 发送 SIGHUP 不会触发陷阱表达式,但只有当我向子 sleep 11666 进程发送信号时,陷阱才会触发。下面是一个演示这个的 bash 会话:
bash-4.1$ test_trap.sh &
[1] 19633
bash-4.1$ starting sleep
bash-4.1$ kill -s SIGQUIT 19633
bash-4.1$ jobs
[1]+ Running test_trap.sh &
bash-4.1$ ps -ef --forest --cols=10000 | grep '11666\|test_trap.sh' | grep -v grep
theuser 19633 12227 0 07:40 pts/4 00:00:00 \_ /bin/bash ./test_trap.sh
theuser 19634 19633 0 07:40 pts/4 00:00:00 | \_ sleep 11666
bash-4.1$ kill -s SIGQUIT 19634
bash-4.1$ Quit (core dumped)
TRAP CAUGHT
[1]+ Exit 1 test_trap.sh
bash-4.1$ ps -ef --forest --cols=10000 | grep '11666\|test_trap.sh' | grep -v grep
bash-4.1$
注意“sleep 11666”只是一个代表进程。该进程实际上可以是一个交互式子外壳(例如,bash -i)。
为什么父进程test_trap.sh 没有捕捉到 SIGHUP 信号?为什么只有在sleep 11666 的进程发出信号时才会触发陷阱?
我不想使用无法捕获的 SIGKILL,因为我确实需要在陷阱表达式中执行各种清理操作。
此脚本旨在在包含 Bash 的任何最新版本的 Linux 发行版上运行(例如,不是 Cygwin)。
参考资料:
【问题讨论】:
标签: bash