我有一個python應用程序(並行)產生子進程(主要是bash腳本)。有些腳本可能會調用其他腳本。我試圖找出最好的方法來處理應用程序的終止邊界情況以及子進程。終止應用程序,多個嵌套子進程
如果應用程序需要退出,或接收SIGTERM
,那麼它應該終止(SIGTERM
,wait
,SIGKILL
)他們創建的所有子流程和任何進程。這種做法將是開始作爲一個新的進程組,並殺死進程組作爲終端(killpg
)的一部分。
如果任何子進程花費的時間超過了指定的時間,我想殺掉它們以及它們創建的子進程。這裏有一個方法是設置應用程序作爲處理組組長,這樣我可能只是killpg組,並且依賴於殺死任何其他子進程。
困難的是這兩個解決方案相互衝突,所以我似乎只能滿足一個要求。
所以,最後的想法是使用tcsetpgrp,但我不太熟悉它。所以,模擬一個交互式終端。這意味着殺死應用程序發送SIGHUP
(我認爲)所有的流程,我可以用進程組來管理殺死耗時過長的子進程。
這是一個好主意,還是我還有其他建議嗎?
獎金部分: 如果應用程序是通過SIGKILL
打死(這是偶爾在該應用程序所需,是的,我知道SIGKILL
應該避免,等...),這將是驚人的,有子進程殺死,以及在與bash在退出時向其進程發送SIGHUP
的方式相同。
如果你能殺一個人子(帶os.setsid創建)及其所有的孩子,然後殺死你的應用程序所產生的所有子進程,你可以使用一個for循環。我沒有看到衝突。 – jfs
HRM,我忘了可選的獎金部分。所以這絕對適用於SIGTERM。我不過還是喜歡鑽研的世界裏,即使是SIGKILL會殺了退出的子進程。 – Duncan
你有沒有發現這種情況下的很好的解決方案?我在我的python程序中遇到同樣的問題。 – sickill