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

5

我正在编写一个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个回答

11

当你单独杀掉一个进程时,它不会杀死子进程。

如果您想要给定组的所有进程都接收到信号,则必须向该进程组发送信号。

kill -9 -parentpid
否则,孤儿进程将与init链接。
子进程可以通过在prctl()系统调用中指定选项PR_SET_PDEATHSIG来请求内核在父进程死亡时向其发送SIGHUP或其他信号:
prctl(PR_SET_PDEATHSIG, SIGHUP);

请参考man 2 prctl获取详细信息。


我已经尝试过了,但我认为我没有名为prctl的函数。 - user3242440

5
发送-9信号(SIGKILL)给一个程序,不会给它执行自己的信号处理程序的机会(例如,你的trap语句)。这就是为什么子进程不会自动终止。(通常情况下,-9不会给应用程序在自我清理后留下任何机会。)你必须使用一种较弱的信号来终止它(如SIGTERM)。
详情请参见man 7 signal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接