我在for循環中運行os.system(cmd)
。由於它有時會掛起,所以我試圖在for循環中使用process=subprocess.pOpen(cmd)
。但我想了解以下內容:python處理子進程
如果我做
sleep(60)
,然後檢查進程仍在使用process.poll()
運行,我怎麼連1分鐘後和工藝掛在實際運行過程中區分?如果我殺死掛起的進程,for循環會繼續還是會退出?
謝謝!
我在for循環中運行os.system(cmd)
。由於它有時會掛起,所以我試圖在for循環中使用process=subprocess.pOpen(cmd)
。但我想了解以下內容:python處理子進程
如果我做sleep(60)
,然後檢查進程仍在使用process.poll()
運行,我怎麼連1分鐘後和工藝掛在實際運行過程中區分?
如果我殺死掛起的進程,for循環會繼續還是會退出?
謝謝!
我不知道任何通用的方法來判斷一個進程是否掛起或正在工作。如果一個進程由於鎖定問題而掛起,那麼它可能會消耗0%的CPU,並且您可能會猜測它已掛起而不工作;但是如果它以無限循環掛起,則該過程可能使CPU百分百繁忙,但不能完成任何有用的工作。你可能有一個進程在網絡上進行通信,與一個超長超時的非常慢的主機通話;那將不會被掛起,但會在等待時消耗0%的CPU。
我認爲,一般來說,唯一的希望是建立某種「看門狗」系統,其中您的子過程使用進程間通信定期發送一個信號,意思是「我還在活」。
如果您不能修改正在運行的子進程的程序,那麼至少揣摩爲什麼它掛起,看看你就可以想出一個辦法去猜測它已經掛。也許它通常具有CPU和I/O的平衡組合,但是當它掛起時,它會進入一個緊密的無限循環,並且CPU使用率會達到100%;那是你的線索,現在是時候殺死它並重新啓動。或者,也許它每隔30秒寫入一個日誌文件,並且可以監視文件的大小,並在文件不增長時重新啓動它。或者,也許你可以把程序放在一個「詳細」模式中,在它打印消息的時候(或者到stdout
或者stderr
),你可以看這些。或者,如果程序作爲守護進程工作,也許你可以主動查詢它並查看它是否存在;例如,如果它是一個數據庫,發送一個簡單的查詢並查看它是否成功。
所以我不能給你一個一般的答案,但我有一些希望你應該能夠找出一種方法來檢測你的特定程序掛起。
最後,最好的解決方案是弄清楚它爲什麼會掛起,並解決問題,這樣它就不會再發生了。這可能是不可能的,但至少要牢記在心。如果程序不再掛起,則不需要檢測掛起的程序!
P.S.我建議你做一個谷歌搜索「如何監控一個過程」,看看你是否從中得到任何有用的想法。
檢測已停止工作的常用方法是讓它們以大致固定的時間間隔發出信號,並讓另一個進程監視信號。如果監視器發現沒有信號到達,比如兩倍的時間間隔,它可以採取行動,例如查殺並重新啓動進程。
這個一般的想法不僅可以用於軟件,也可以用於硬件。我已經用它來重新啓動嵌入式控制器,只需向a.c充電一個電容。來自輸出位的耦合信號。一個簡單的檢測器監控電容器,並且如果電壓低於某個閾值,則只需將復位線拉低,同時將電容器充電足夠長時間以使控制器重新啓動。
軟件的原理是相似的;一種方法是讓程序間隔地簡單地觸摸一個文件。監視器會每隔一段時間檢查一次文件修改時間,如果過早殺死並重新啓動該進程。
在OP的情況下,子進程可以寫一個狀態碼給一個文件來說明它在工作中有多遠。