pkill 不會殺死進程的直接後代之後的進程

pkill 不會殺死進程的直接後代之後的進程

我想殺死一系列進程,例如

PID  PPID
100  XXX
101  100
102  101

當我使用pkill -P 100PID 100 和 101 時,它按預期死亡,但 102 被賦予 init,因為它是 PPID。

如何強制 pkill 繼續殺死進程的直接後代之後的連結進程?

答案1

pkill完全按照您告訴它的方式執行:它殺死了父級為 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 來殺死整個命名空間。

相關內容