2012-11-13 61 views
4

我有一個python應用程序(並行)產生子進程(主要是bash腳本)。有些腳本可能會調用其他腳本。我試圖找出最好的方法來處理應用程序的終止邊界情況以及子進程。終止應用程序,多個嵌套子進程

如果應用程序需要退出,或接收SIGTERM,那麼它應該終止(SIGTERMwaitSIGKILL)他們創建的所有子流程和任何進程。這種做法將是開始作爲一個新的進程組,並殺死進程組作爲終端(killpg)的一部分。

如果任何子進程花費的時間超過了指定的時間,我想殺掉它們以及它們創建的子進程。這裏有一個方法是設置應用程序作爲處理組組長,這樣我可能只是killpg組,並且依賴於殺死任何其他子進程。

困難的是這兩個解決方案相互衝突,所以我似乎只能滿足一個要求。

所以,最後的想法是使用tcsetpgrp,但我不太熟悉它。所以,模擬一個交互式終端。這意味着殺死應用程序發送SIGHUP(我認爲)所有的流程,我可以用進程組來管理殺死耗時過長的子進程。

這是一個好主意,還是我還有其他建議嗎?

獎金部分: 如果應用程序是通過SIGKILL打死(這是偶爾在該應用程序所需,是的,我知道SIGKILL應該避免,等...),這將是驚人的,有子進程殺死,以及在與bash在退出時向其進程發送SIGHUP的方式相同。

+0

如果你能殺一個人子(帶os.setsid創建)及其所有的孩子,然後殺死你的應用程序所產生的所有子進程,你可以使用一個for循環。我沒有看到衝突。 – jfs

+0

HRM,我忘了可選的獎金部分。所以這絕對適用於SIGTERM。我不過還是喜歡鑽研的世界裏,即使是SIGKILL會殺了退出的子進程。 – Duncan

+0

你有沒有發現這種情況下的很好的解決方案?我在我的python程序中遇到同樣的問題。 – sickill

回答

0

一個possibiltiy,使你的腳本自行終止。

Perl有一個結構,你可以設置鬧鐘。

很好的例子eslewhere在這個網站在這裏:

https://stackoverflow.com/questions/3427401/perl-make-script-timeout-after-x-number-of-seconds 

Perl, make script timeout after x number of seconds?

也有類似的命中尋找蟒蛇報警超時腳本。

https://stackoverflow.com/questions/1191374/subprocess-with-timeout 

Using module 'subprocess' with timeout

這有副作用(優勢或缺陷...),只要子進程比父較短的超時,那麼家長可能能夠正常恢復。

但是,最好限制CPU時間而不是掛鐘時間。在這樣一個遙遠的後代沒有架起來的時候了父母,如果整個系統緩慢,由於許多過程,你沒有得到一個死亡瘟疫amoung你的子流程。

您可以通過輸入

ulimit -t X 

其中x是你想要的CPU秒數在bash腳本做到這一點。但請注意,在大多數系統中,這是一條單行道。一個進程不能增加它自己的限制。