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

use*_*440 5 unix linux shell pid kill-process

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

trap "kill $$" SIGINT
trap 'kill -HUP 0' EXIT
trap 'kill $(jobs -p)' EXIT
Run Code Online (Sandbox Code Playgroud)

这些命令正在使用kill [parent_process_ID]命令但如果我使用kill -9 [parent_process_ID]那么只有父进程将被终止.请进一步指导我实现此功能,以便当我使用任何命令终止父进程时,也应该杀死子进程.

Jay*_*hoi 9

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

如果希望给定组的所有进程都接收信号,则必须将信号发送到进程组.

kill -9 -parentpid
Run Code Online (Sandbox Code Playgroud)

否则,孤儿将被链接到init.

SIGHUP通过PR_SET_PDEATHSIGprctl()syscall中指定选项,子进程可以让内核传递(或其他信号),如下所示:

prctl(PR_SET_PDEATHSIG, SIGHUP);
Run Code Online (Sandbox Code Playgroud)

详情man 2 prctl请见.


jpa*_*ugh 5

-9signal(SIGKILL)发送到程序不会给它执行自己的信号处理程序(例如,你的trap语句).这就是孩子们不会自动被杀的原因.(一般情况下,-9没有机会应用到清理后本身.)你必须使用一个较弱的信号,将其杀死(如SIGTERM).

详情man 7 signal请见.