我在 Linux 上有一个应用程序,我必须从应用程序内部终止整个进程树。进程树如下所示:
app
└── parent
├── child1
├── child2
├── child3
├── child4
└── child5
现在,当我通过 kill 命令终止进程树时,我遇到了问题parent
:当我尝试终止进程时,经常会发生几个子进程未被终止的情况parent
。在 kill 信号发出后,子进程显示为“分离”,因为它们不再位于进程树中,而是位于原始应用程序下方app
。这是怎么发生的?
答案1
可靠地终止进程树并不是一件简单的事情,其中存在一些陷阱,例如:
- 杀死父母通常不会杀死孩子
- 如果杀手进程与进程组相同,则按进程组终止通常会失败,因为杀手进程本身也会被终止,通常是在完成其工作之前
- 识别一个进程的所有后代并不是一件容易的事
您可能希望通过我对这些或多或少相关的问答的回答来了解详细信息:
- https://stackoverflow.com/questions/30980234/linux-the-most-reliable-way-to-terminate-a-family-of-processes
- https://stackoverflow.com/questions/31298392/i-need-to-trace-all-child-processes-created-by-given-process-in-linux-or-posix
- https://stackoverflow.com/questions/30780487/python-script-to-monitor-process-and-sub-processes
答案2
一般来说,在 POSIX 系统中,杀死父进程也不会杀死它的子进程。
特别是如果你使用kill -KILL
,在杀死父进程后,子进程就变成了孤立进程。
你可以杀死整个进程组或者在终止父进程之前按父进程 pid 搜索进程。在 shell 中可以使用以下命令完成:
ps --ppid <parent_pid>
在 python 中我建议使用psutil图书馆,尤其是Process.children
方法。