Sysvinit

start-stop-daemon 不會將我的 Python 腳本作為服務啟動

  • September 7, 2017

我正在嘗試在我的 Debian 機器上執行 Google AppEngine,我創建了一個文件init.d/gae

. /lib/lsb/init-functions

#
# Initialize variables
#

name=gae
user=$name

pid=/var/run/$name.pid
prog="python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www"


case "${1}" in
  start)
     echo "Starting...Google App Engine"
     start-stop-daemon --start --make-pidfile --background --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" 

     ;;

  stop)
     echo "Stopping...Google App Engine"

     ;;

  restart)
     ${0} stop
     sleep 1
     ${0} start
     ;;

  *)
     echo "Usage: ${0} {start|stop|restart}"
     exit 1
     ;;
esac

exit 0

# End scriptname

我正在通過手動呼叫來測試腳本,並且腳本執行但不是作為守護程序執行,或者至少它不會與終端分離。我期待/尋找與 Apache 類似的功能。

我錯過了什麼開關?


編輯

我應該注意,儘管開關指示應該創建它,但沒有寫入或創建 PID 文件

我可以看到您有兩個問題:

prog=python /opt/google_appengine/dev_appserver.py –host=0.0.0.0 –admin_host=0.0.0.0 –php_executable_path=/usr/bin/php-cgi /var/www

將從環境/opt/google_appengine/dev_appserver.py開始prog=python。這是在你的start塊之前,所以start-stop-daemon甚至沒有參與。

快速解決方法是像這樣引用整個作業:

prog=‘python /opt/google_appengine/dev_appserver.py –host=0.0.0.0 –admin_host=0.0.0.0 –php_executable_path=/usr/bin/php-cgi /var/www’

但更好的解決方法是使用來自/etc/init.d/skeleton, 的樣式並執行

DAEMON='python /opt/google/appengine/dev_appserver.py'
DAEMON_ARGS='--host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www'

第二個問題是您錯誤地引用了$prog.

啟動-停止-守護程序 –start –make-pidfile –background –oknodo –user " $ user" –name " $ 名稱“–pidfile” $ pid" –startas " $ 編”

告訴start-stop-daemon嘗試啟動一個名為python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www.

但很明顯,沒有這樣的程序。你想從python爭論開始。刪除雙引號是一種快速修復,但更好的/etc/init.d/skeleton方法是

啟動-停止-守護程序 –start –quiet –chuid $ CHUID –pidfile $ PIDFILE –exec $ DAEMON – $ DAEMON_ARGS

引用自:https://unix.stackexchange.com/questions/154692