Linux
安全地殺死程序組
如何安全地終止程序組,並在需要時強制終止?
目標是使用 SIGTERM (-15) 殺死,然後如果樹中的應用程序在超時(例如 60 秒)後沒有死亡,則執行 SIGKILL (-9)。
我們有一個父程序和一個子程序的場景,共享一個 pgid,例如
Parent Process pid=123, pgid=123 |- Child Process pid=456, pgid=123
目前我們正在向程序組發送 SIGTERM (-15),然後如果父程序已死,則假設成功。
但是,有時我們會發現父程序死掉了,而子程序並沒有死掉。
所以這歸結為兩個問題:
- 如果孩子沒有死,為什麼父母 pid 會死(這是可能的,還是我的假設是錯誤的)?
- 在將 kill -9 發送到程序組之前,檢查程序組中是否有任何程序是確保樹中所有程序都已死的最佳方法嗎?
- 如果父母關心他們的終止狀態,它必須顯式地等待()它的孩子。預設情況下,孤兒被轉移到 init (pid1) 並且不會被終止。
- 不幸的是,當它們被 init 採用時,它們的 pgid 更改為自己的 pid(孤兒成為自己的會話和 pg 領導者)。
如果你想確定,你必須列出 pg 中的所有 PID,然後輪詢以確保它們死亡。當領導者死亡時,程序組本身會解散,因此您無法監視該 pgid 中的程序。
如果你真的,真的想確定(因為 PID 可以在非常繁忙的系統上重用),你需要做一個深度優先的程序樹遍歷父到子並殺死子葉節點,等待每個在殺死下一個級別之前終止,但您可能會與重生死去的孩子的父母發生衝突。SO上this answer中的腳本處理了這種極端情況。