我有个问题。研究进程管理我在 CentOS 7 上观察到一个奇怪的行为。我知道杀死一个父进程,子进程也被杀死。但不是在以下情况下。我运行了命令 dd,例如:
[root@server2 ~]# dd if=/dev/zero of=/dev/null &
[1] 1756
[root@server2 ~]# ps fax | grep -B2 dd
1737 pts/2 S 0:00 \_ su -
1741 pts/2 S 0:00 \_ -bash
1756 pts/2 R 1:18 \_ dd if=/dev/zero of=/dev/null
之后,我尝试杀死(使用 SIGKILL 信号)父进程,即 bash,但此操作不会杀死 dd 进程:
[root@server2 ~]# kill -9 1741
Killed
[user@server2 ~]#
shell 终止,但正如您在顶部命令输出中看到的那样,dd 进程仍在工作:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1756 root 20 0 107948 612 512 R 99.9 0.1 10:06.98 dd
请问您对此有什么想法吗?
默认情况下,杀死父进程不会杀死子进程。
我建议您寻找有关如何使用进程组(负 PID)杀死父母和孩子的其他问题。
可以在Process descendants中找到有关如何详细执行此操作的一个很好的答案
请根据自己的需要进行调整,尤其是在 kill 命令上:
示例用法是:
kill_recurse <my_parent_pid>
我遇到了类似的情况并找到了答案。
TLDR;
尝试:
kill -2 <parent_pid>
您将知道此方法是否适合您,如果在运行脚本时按下Ctrl+C会杀死父进程和所有生成的进程。
其原因是
kill
可以发送的不同信号。默认情况下kill <pid>
会发送15 <SIGTERM>
信号。但实际上按Ctrl+时的常规信号C并非如此。15 <SIGTERM>
2 <SIGINT>
所以如果你
kill -2 <pid>
这会杀死你的父进程,就好像用Ctrl+打断它一样C资源