
有時,向進程發送 SIGTERM 會導致它向其所有子進程發送 SIGTERM。然而,有時這不起作用。
是否有命令或實用程式允許我同時終止進程及其所有子進程?我通常會手動將所有 pid 收集到一個終止命令中,但這感覺很愚蠢。
這個問題詢問如何使用 perl 執行此操作,但任何能完成工作的方法都很棒。
答案1
這那麼問題涵蓋了這一點。
答案2
假設進程共用一個會話標識符(除非它們明確地呼叫了setsid(),否則它們應該共用一個會話標識符,您可以使用 pkill 透過會話殺死它們:
user@machine:~> ps -o pid,sess,cmd -U user
PID SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
PID SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$
如果從另一個終端我這樣做:
pkill -9 -s 12804
然後一切就一下子就消亡了。
您可以類似地按進程組殺死,儘管這對於許多比父進程低一級的子進程更有用,而不是關聯進程鏈。
答案3
通常,回應的客戶端應該收到 sigterm 並關閉自身,從而終止其所有分叉子進程。另一方面,如果客戶端沒有回應,則正常的終止訊號可能不會引起任何回應。
因此,您然後繼續發送 SIGKILL,它告訴系統本身立即停止該進程 - 它在大多數情況下都可以執行此操作,除非進程處於不可中斷睡眠狀態,例如等待某些 I/O輸入或類似。
在這種情況下,即使是 SIGKILL 最終也不會對該進程執行任何操作;子進程可能會處於類似的遲緩狀態。
有一種邊界情況,父進程可能會很好地終止,但子進程不可終止。那麼你最終會得到一個殭屍進程,由於它的父親已經消失,所以無法清理它,但它不會回應任何東西。擺脫這些的唯一方法是重新啟動;但在大多數情況下,它們是無害的,因為它們唯一做的就是佔用一個 PID,而它們嘗試使用的任何套接字都已經消失了。
答案4
如果我想殺死Firefox的進程樹,那麼是否可以透過上面的命令「pkill -9 -s firefox」來殺死它