2013-07-19 147 views
34

我已經在Python中編寫了一個模塊,並希望它在開始運行時連續運行,並且需要在需要更新其他模塊時停止運行。如果模塊崩潰或者沒有運行,我可能會使用monit來重新啓動它。守護進程vs Upstart for python腳本

我會通過不同的技術,如DaemonUpstart等等。

哪家去,讓我使用過我的所有新模塊的方式來永遠保持運行它們的最好方法?

回答

67

從你的新貴提到我會認爲這個問題是一個Ubuntu服務器上的服務正在運行。

在Ubuntu服務器是一個暴發戶的工作確實是在服務創建一個總是在合適的時間啓動,並可以停止或熟悉的命令重新加載最簡單,最方便的選擇。

要創建你需要一個單一的文件添加到/etc/init一個暴發戶的服務。名爲<service-name>.conf。一個示例腳本是這樣的:

description "My chat server" 
author "[email protected]" 

start on runlevel [2345] 
stop on runlevel [!2345] 

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set 

respawn 

exec /srv/applications/chat.py 

這意味着每次機器啓動將啓動chat.py程序。如果因爲任何原因死亡,它會重新啓動它。您不必擔心雙重分叉或以其他方式守護您的代碼。那是暴發戶爲你處理的。

如果要停止或啓動過程中,你可以用

service chat start 
service chat stop 

名稱這麼做chat自動從.conf文件的名稱裏面/etc/init

我只涵蓋發現這裏新貴的基礎知識。還有很多其他功能可以使它更加有用。所有可用的運行man upstart

這種方法更方便,比寫自己的系統守護進程的代碼。一個內置的Ubuntu組件的4-8行配置文件比使你的代碼安全地插入雙叉然後讓另一個進程監視它以確保它不會消失更容易出錯。

Monit是一個紅鯡魚。如果您需要停機警報,則無論如何您都需要在單獨的服務器上運行監控程序。依靠新貴來保持流程始終在服務器上運行。然後有一個不同的服務,確保服務器實際運行。停機發生的原因有很多。運行在同一臺服務器上的進程完全不會告訴你服務器本身是否發生故障。你需要一個單獨的機器(或者像pingdom這樣的第三方提供商)來提醒你這種情況。

+0

是否有任何真實的來源支持您的答案? 在Ubuntu上運行是一個選項,但不是強制性的(守護進程可以同時運行)。 第二,你必須使用monit甚至與暴發戶獲得停機警報。 – mtariq

+0

你可以得到新貴,當它停止/啓動時通過電子郵件發送給你(http://serverfault.com/questions/236925/how-can-i-receive-an-email-when-an-upstart-monitored-script-respawns) 。真實來源?人們在生產中到處使用新貴。我們在生產中使用新貴您不能使用監控宕機警報。沒有用。請參閱編輯答案爲什麼。 – aychedee

+0

偉大的職位。 Upstart位於Debian樹中,所以它可能用於香草debian或薄荷以及其他衍生產品。 – meawoppl

3

我用舊式啓動腳本啓停守護utility.Look在skel中在/etc/init.d

5

你可以檢查出supervisor。它能夠在系統啓動時啓動一個進程,然後保持活動狀態直到關閉。

最簡單的配置文件將是:

[program:my_script] 
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py 
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR 
autostart = True 
autorestart = True 

然後,你可以將其鏈接到/etc/supervisord/conf.d,運行sudo supervisorctlreread進入導師的管理控制檯,類型,以便主管啓事新的配置項,update顯示新程序在status列表中。

要啓動/重新啓動/停止程序,您可以執行sudo supervisorctl start/restart/stop my_script

+0

一般讀者指出,主管不能使用Python 3。 – shongololo