2012-12-05 273 views
9

我已經使用werkzeug創建了小型web服務器,並且能夠以通常的Python方式運行它,使用python my_server.py。頁面加載,一切正常。現在我想在我的電腦啓動時啓動它。最簡單的方法是什麼?我一直在努力與暴發戶,但它似乎並沒有「生活在一個背景」因爲我執行start my_server後,我立即收到kernel: [ 8799.793942] init: my_server main process (7274) terminated with status 1在啓動時運行python腳本作爲守護進程(Ubuntu)

my_server.py:

... 
if __name__ == '__main__': 
    from werkzeug.serving import run_simple 
    app = create_app() 
    run_simple('0.0.0.0', 4000, app) 

新貴配置文件my_server.conf :

description "My service" 
author "Some Dude <[email protected]>" 
start on runlevel [2345] 
stop on runlevel [016] 
exec /path/to/my_server.py 
start on startup 

任何想法如何使它工作?或者任何其他更好的方式來守護腳本?

更新: 我相信問題在於my_server.py。它似乎並沒有首先啓動網絡服務器(方法run_simple())。應該採取哪些步驟來讓.py文件由任務處理程序運行,如新貴?

  • 將家當作爲一線#!/usr/bin/env python
  • 允許執行權限chmod 755
  • 開始與超級用戶權限的守護程序(以絕對確保沒有任何權限限制阻止其啓動)
  • 確保所有的Python庫那裏!
  • 還有別的嗎?

解決: 問題是缺少蟒蛇依賴。通過任務管理器啓動腳本時(例如upstartstart-stop-daemon),不會引發錯誤。需要絕對確定pythonpath包含你需要的一切。

+0

嘗試運行級別235並形成你運行服務器的用戶你使用4000權限的端口,這需要管理員的權限。 – Denis

+0

我以超級用戶身份運行它,並將運行級別更改爲235並沒有幫助。 – and3p

+0

您的應用程序的依賴項服務可能尚未啓動嗎?像一些數據庫? – tdihp

回答

11

一個簡單的方法是使用crontab來做到:

$ crontab -e 

crontab文件就會出現編輯,在最後寫了一行:

@reboot python myserver.py 

並退出。現在,每次重新啓動後,cron守護進程將運行您的myserver python腳本。

+3

您的建議可能會起作用,但我更喜歡能夠啓動/停止/重新啓動守護進程,而不是在發生崩潰時重新啓動整個系統。 – and3p

+1

如果你有興趣將你的代碼變成一個真正的守護進程(我認爲它已經存在了,你只需要開始它就可以了),你可以查看http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/在啓動的時候) – kaspersky

17

除了gg.kaspersky方法,你也可以把你的腳本轉換爲「服務」,這樣您就可以開始使用或停止:

$ sudo service myserver start 
* Starting system myserver.py Daemon       [ OK ] 
$ sudo service myserver status 
* /path/to/myserver.py is running 
$ sudo service myserver stop 
* Stopping system myserver.py Daemon       [ OK ] 

,並把它定義爲通過一個啓動服務:

$ sudo update-rc.d myserver defaults 

爲此,您必須創建該文件並將其保存在/etc/init.d/中。

#!/bin/sh -e 

DAEMON="/path/to/myserver.py" 
DAEMONUSER="myuser" 
DAEMON_NAME="myserver.py" 

PATH="/sbin:/bin:/usr/sbin:/usr/bin" 

test -x $DAEMON || exit 0 

. /lib/lsb/init-functions 

d_start() { 
     log_daemon_msg "Starting system $DAEMON_NAME Daemon" 
     start-stop-daemon --background --name $DAEMON_NAME --start --user $DAEMONUSER --exec $DAEMON 
     log_end_msg $? 
} 

d_stop() { 
     log_daemon_msg "Stopping system $DAEMON_NAME Daemon" 
     start-stop-daemon --name $DAEMON_NAME --stop --retry 5 --name $DAEMON_NAME 
      log_end_msg $? 
} 

case "$1" in 

     start|stop) 
       d_${1} 
       ;; 

     restart|reload|force-reload) 
         d_stop 
         d_start 
       ;; 

     force-stop) 
       d_stop 
       killall -q $DAEMON_NAME || true 
       sleep 2 
       killall -q -9 $DAEMON_NAME || true 
       ;; 

     status) 
       status_of_proc "$DAEMON_NAME" "$DAEMON" "system-wide $DAEMON_NAME" && exit 0 || exit $? 
       ;; 
     *) 
       echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}" 
       exit 1 
       ;; 
esac 
exit 0 

在這個例子中,我假設你有一個像#一個家當!在/ usr/bin中/ Python的在你的Python文件的頭部,這樣就可以直接執行它。

最後但並非最不重要的,不要忘了給執行權限給你的Python服務器和服務的腳本:

$ sudo chmod 755 /etc/init.d/myserver 
$ sudo chmod 755 /path/to/mserver.py 

這裏的page在那裏我學會了這原本(法國)。

乾杯。

+0

很好的解釋,以創建一個deamon,但正如我的更新建議我相信'腳本'本身有什麼問題。 – and3p

+0

@tvuillemin:這個方法對我很有用,但我需要調試我的腳本......我在哪裏可以找到守護程序腳本的標準輸出和錯誤輸出? – Throoze

4

如果您有啓動時啓動的supervisor服務,那麼編寫監督服務要簡單得多。

如果程序失敗,您甚至可以設置autorestart。