我想杀死一系列进程,例如
PID PPID
100 XXX
101 100
102 101
当我使用pkill -P 100
PID 100 和 101 时,它按预期死亡,但 102 被赋予 init,因为它是 PPID。
如何强制 pkill 继续杀死进程的直接后代之后的链接进程?
答案1
pkill
完全按照您告诉它的方式执行:它杀死了父级为 100 的进程。而不是父级的父级为 100 的进程。
Linuxpkill
和 FreeBSD 都没有遍历进程树的选项。您可以调用pstree -l
并解析其输出。
请记住,如果 A 分叉 B,B 分叉 C,然后 B 死亡,则不存在可以连接 A 和 C 的父子关系。
可能有一种方法可以终止所有这些进程,但要注意它可能会过度匹配。
如果您将负进程 ID 传递给kill
,则会杀死整个进程进程组。这是原子性的,因此即使其中一个进程在您运行时分叉,它也能工作kill
。这只会杀死未将自己放入自己的组中的进程,并且还会杀死父进程和其他进程(如果它们位于同一进程组中)。运行ps -o pgid …
查看进程的进程组ID。
如果您要杀死的所有进程都打开了特定文件,则可以fuser -k /some/file
使用全部打开该文件的进程。
Linux 上的另一个选择是在自己的 PID 命名空间中运行进程。然后,您可以通过从命名空间内杀死伪 PGID -1 来杀死整个命名空间。