2014-05-07 79 views
1

我有一個運行的程序,它監聽一個隊列(它不是多線程的,所以我想運行它的幾個實例)。我盡了最大的努力來捕捉錯誤,但是如果應用程序因錯誤或傳入數據錯誤而崩潰,我希望能夠重新生成Python應用程序(在我登錄堆棧跟蹤之後),以便繼續工作。如何監控python進程並重新啓動它是否死亡?

我覺得這可能是運行基於python的服務的人的一個常見問題,所以我想我會問,但我正在考慮編寫一些代碼來執行ps -ef並計算python程序名稱的實例(if小於一個門檻,那麼我會讓程序重新啓動它)。

在我建立這個之前,我想知道是否有更好的方法或現有的工具/模塊做到這一點?

謝謝!

+0

嘗試google搜索「看門狗」這就是通常所說的這種任務 – wim

回答

2

結帳supervisord。我經常使用它來啓動,監視所有類型的東西。

這是我如何將其設置爲我的服務器上啓動WSGI應用:

[program:quizzes] 
directory = /var/www/quizzes.seasources.net 
command = /home/jaime/code/virtualenv/quizzes/bin/uwsgi uwsgi.ini 
process_name = quizzes 
autostart = true 
startsecs = 5 
user = www-data 
redirect_stderr = true 
stdout_logfile = /var/www/quizzes.seasources.net/logs/supervisor-console.log 
environment = PYTHON_EGG_CACHE=/tmp/python-eggs 

配置文件格式是很容易理解,它甚至記錄標準輸出/標準錯誤到一個文件中。上面是/var/www/quizzes.seasources.net/logs/supervisor-console.log你可以閱讀更多關於配置here

+3

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Blazemonger

+0

好點,我包含了一個我自己使用的簡單配置部分。 – jaime

2

您可以使用主管。一個以Python編寫的着名應用程序將是supervisord,在Python中最近的一個應該是Circus,然後有Monit或daemontools,可能還有更多。

0

如果你正在尋找一些更簡單的,你可以使用子模塊(蟒蛇默認)開始,檢查你的流程... 一個基本的版本是這樣的:

# run.py 

import subprocess, time 

# add your listener processor call here 
_PROCESS_ARGS = ['python','/path/to/listener.py'] 
_PROCESS_TOTAL = 10 

process_list = [] 

# start the processes... 
for i in range(_PROCESS_TOTAL):  
    process_list.append(subprocess.Popen(_PROCESS_ARGS)) 

while True:  
    for i in range(_PROCESS_TOTAL):   
     p = process_list[i]   
      if p.poll() != None: # check if process is running      
       process_list[i] = subprocess.Popen(_PROCESS_ARGS) # if not, replace with new one 
    time.sleep(1) # check only every second... 
相關問題