使用SIGKILL杀死父进程和子进程

时间:2014-02-19 01:38:50

标签: linux shell unix pid kill-process

我正在编写一个shell脚本,其中我有父进程,并且它具有由sleep &命令创建的子进程。现在我想杀死父进程,以便子进程也将被杀死。我能用以下命令做到这一点:

trap "kill $$" SIGINT
trap 'kill -HUP 0' EXIT
trap 'kill $(jobs -p)' EXIT

这些命令正在使用kill [parent_process_ID]命令,但如果我使用kill -9 [parent_process_ID],那么只会杀死父进程。 请进一步指导我实现这个功能,这样当我用任何命令杀死父进程时,子进程也应该被杀死。

2 个答案:

答案 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