我有一个
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不会触发陷阱表达式,但只有当我将信号发送到子睡眠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$
请注意,“睡眠11666”只是一个代表性的过程.该过程实际上可以是交互式子shell(例如,bash -i).
为什么父test_trap.sh进程没有捕获SIGHUP信号?为什么只有在发出睡眠过程11666时才会触发陷阱?
我不想使用无法捕获的SIGKILL,因为我需要在陷阱表达式中进行各种清理操作.
此脚本适用于任何包含Bash的Linux发行版的最新版本(例如,不是Cygwin).
参考文献:
> killing Parent process along with child process using SIGKILL
> Kill bash and child process