2013-12-10 94 views
4

我有一個連續處理新數據並寫入到mongodb的python腳本。在腳本中,它的一個while循環和一個sleep連續運行代碼。永遠運行Python腳本,記錄錯誤並在崩潰時重新啓動

建議如何永久運行Python腳本,發生錯誤時記錄錯誤,並在崩潰時重新啓動?

請問node.js的forever是否合適?我也在同一臺Ubuntu服務器上運行node/meteor。

+0

你甚至需要啓動該節點/流星內的Python腳本?如果您只是通過數據庫進行交互,爲什麼不單獨啓動? –

+0

@ChristianF python腳本不需要從node/meteor開始。我想也許node/meteor可以幫助管理python腳本。 – Nyxynyx

回答

1

最近寫了類似的東西。我遵循的基本模式是

while True: 
    try: 
     #functionality 
    except SpecificError: 
     #log exception 
    except: #catch everything else 
    finally: 
     time.sleep(600) 

要處理重新啓動,您可以使用init.d或cron作業。

0

如果你正在寫一個守護進程,你應該使用這個命令做到這一點: http://manpages.ubuntu.com/manpages/lucid/man8/start-stop-daemon.8.html

您可以從System V的/etc/init.d/中的腳本產卵這一點,或使用新貴它正在慢慢取代它。

新貴:http://upstart.ubuntu.com/getting-started.html

系統V:http://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html

我發現系統V更容易寫,但如果這將永遠被打包並以Debian文件,我建議寫一個暴發戶的conf。

絕對保持睡眠狀態,這樣它就不會控制CPU負載。

4

supervisord是完美的這種事情。雖然我曾經檢查程序是否每012分鐘運行一次cron作業,但supervisord會在進程內線程中運行所有程序,所以如果程序終止,supervisord會自動重啓進程。我不再需要分析ps的輸出以查看程序是否崩潰。

它有一個簡單的聲明配置文件和可配置的日誌記錄。默認情況下,它爲your-program-name-stderr.logyour-program-name-stdout.log創建一個日誌文件,當從OS軟件包管理器(我爲Debian)安裝supervisord時,這些文件將由logrotate自動處理。

如果你不想配置supervisord的日誌記錄,你應該在python中看logging,這樣你就可以控制進入這些文件的內容。

如果您使用的是debian衍生產品,則只需通過以root身份執行apt-get install supervisord即可安裝並啓動守護進程。

配置文件是非常簡單太:

[program:myprogram] 
command=/path/to/my/program/script 
directory=/path/to/my/program/base 
user=myuser 
autostart=true 
autorestart=true 
redirect_stderr=True 

supervisorctl也可以讓你看到你的程序交互做的和可以啓動和停止多個程序與supervisorctl start myprogram

相關問題