pkill 不会杀死进程的直接后代之后的进程

pkill 不会杀死进程的直接后代之后的进程

我想杀死一系列进程,例如

PID  PPID
100  XXX
101  100
102  101

当我使用pkill -P 100PID 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 来杀死整个命名空间。

相关内容