我有一個腳本用於在自定義服務器環境中重新部署幾個程序(即:不是具有代碼熱啓動的已建立的標準容器)。爲此,它會關閉服務器進程,但這需要一些時間來完全關閉所有連接。這些不是perlscript的子進程。他們通常每次運行數百天,所以我寧願不必將服務器進程封裝在perlscript中,以便我可以在幾個月或幾年之後優雅地關閉它們。Perl,等待非子進程退出
所以目前要等待他們重新部署期間死亡的,我解析的ps -ef
輸出,抓住PID字段,殺死PID,等待60秒(這似乎是一個合理的時間與這些進程),重新檢查ps -ef
以確保它們已經死亡等。繼續使用拷貝,chmods等。
這個解決方案對我來說感覺很蹩腳。我已經谷歌全部,並沒有看到這個特定的話題上的任何東西;有一堆關於等待分岔的孩子的材料,如果只是以這種方式運行,waitpid將是完美的。
從閱讀How to wait for exit of non-children processes(這是c
具體)我猜測除了讀取/ proc/pid之外,其他方面我可以做的其他事情不多,但我想也許會有一個perl特定的解決方案某處。有任何想法嗎?
其它疑難雜症是( )發送信號,即使信號爲0,也受到Unix權限的限制。因此,例如,在用戶帳戶運行的Perl腳本中執行kill(0,123),其中進程ID 123由root擁有將導致返回值爲假(0),儘管進程ID 123處於活動狀態並且好。 – 2011-02-28 01:38:11
@John Siracusa:我假設他/她有權殺死,但如果沒有,您仍然可以通過測試'kill(0,$ pid)||來判斷一個進程是否存在。 $! != ESRCH' – ysth 2011-02-28 02:29:11
感謝輸入的人,我很高興我沒有錯過一些明顯的'銀彈'。 'kill 0,$ pid'在檢查errno時很有效。 – Decker 2011-02-28 18:33:50