2017-03-06 48 views
1

我有一個在supervisor下運行的python腳本。如何重新啓動腳本,如果它停止工作,但仍然顯示爲在監督員下運行

我選擇了主管事業就會自動啓動腳本時,機器啓動起來,當腳本所謂的「死」

它的作用是執行後running.log每3-6秒它會不斷寫入日誌文件一些行動。

如果有例外,它將寫入異常到一個單獨的日誌文件。

腳本停止,儘管在此期間沒有異常後5小時寫running.log

它仍顯示爲下運行主管和有在它理應停止寫入running.log的時候也不例外。

然而,它停止了成功,儘管這樣做5個小時寫running.log腳本。

我然後再手動重新啓動下監督員的服務。

我有什麼選擇?

+0

首先想到的是:腳本中存在一些錯誤。你應該解決這個問題,確保腳本死亡......或者另一種選擇是將一些「看門狗」機制放在其中(儘管我不會建議這樣做)。 – MariusSiuram

+0

我不確定如何複製此錯誤,因爲我可以在檢測到此站點前數小時。我可以編寫一個腳本,基本上每30秒檢查一次'running.log'的大小,如果它無法更改,那麼腳本會告訴主管重新啓動服務? –

+0

這將是一個監督機制。請注意,該錯誤仍然存​​在,我建議(首先)嘗試調試它 - 例如,一旦失敗就將調試器附加到正在運行的進程。 – MariusSiuram

回答

1

我能想到的兩個選項:

1.查找錯誤

腳本沒有反應,但沒有死。這意味着它已經陷入了僵局,或者陷入了無限循環,或者被鎖定在某些I/O過程中或者其他什麼地方。

我要說的是,發現的bug,並刪除它是行動的偉大曆程!您可以查看代碼並感受可能發生的情況,添加一些日誌詳細程度或類似信息。或者你可以調試它。有一些機制可將調試器附加到正在運行的Python腳本中: https://wiki.python.org/moin/DebuggingWithGdb

您將需要權限才能執行此操作。如果它是一個生產代碼,那麼這是一個壞消息......但是在生產機器中有一個未檢測到的未定義錯誤並不合適。那麼也許你可以設置一些舞臺機器並在那裏調試腳本?這樣你就可以找到問題所在。

2.添加一些看門狗機制

您可以添加一些進程來觀察腳本。其實腳本本身可以把它變成東西來看日誌文件的修改時間。骷髏(未經測試):

def watch(watch_path): 
    last_modified = <get modification time of watch_path> 
    while True: 
     <sleep> 
     if <check modification times>: 
      <kill> os.getppid() # kill parent process 
     else: 
      last_modified = <get modification time> 

... 

p = multiprocessing.Process(target=watch, args=(log_output_path,)) 
相關問題