我正在编写一个shell脚本,其中我有父进程,并且它具有由sleep &
命令创建的子进程。现在我想杀死父进程,以便子进程也将被杀死。我能用以下命令做到这一点:
trap "kill $$" SIGINT
trap 'kill -HUP 0' EXIT
trap 'kill $(jobs -p)' EXIT
这些命令正在使用kill [parent_process_ID]
命令,但如果我使用kill -9 [parent_process_ID]
,那么只会杀死父进程。
请进一步指导我实现这个功能,这样当我用任何命令杀死父进程时,子进程也应该被杀死。
答案 0 :(得分:9)
当你单独杀死一个进程时,它不会杀死孩子。
如果您希望给定组的所有进程都接收信号,则必须将信号发送到进程组。
kill -9 -parentpid
否则,孤儿将被链接到init
。
通过在SIGHUP
系统调用中指定选项PR_SET_PDEATHSIG
,孩子可以要求内核在父母死亡时传递prctl()
(或其他信号):
prctl(PR_SET_PDEATHSIG, SIGHUP);
有关详细信息,请参阅man 2 prctl
。
答案 1 :(得分:5)
将-9
信号(SIGKILL
)发送给程序会让没有机会让它执行自己的信号处理程序(例如,您的trap
语句) 。这就是孩子们不会自动被杀的原因。 (一般情况下,-9
为应用程序提供 no 机会,以便自行清理。)您必须使用较弱的信号来杀死它(例如SIGTERM
。)< / p>
有关详细信息,请参阅man 7 signal
。