web-dev-qa-db-ja.com

start-stop-daemonがサービスとしてスクリプトを開始しないPythonスクリプト

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ファイルが作成または作成されていないことに注意してください。

5
Alex.Barylski

私には2つの問題があります。

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.pyprog=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'

2番目の問題は、$progを誤って引用していることです。

start-stop-daemon --start --make-pidfile --background --oknodo --user "$ user" --name "$ name" --pidfile "$ pid" --startas "$ prog"

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-stop-daemon --start --quiet --chuid $ CHUID --pidfile $ PIDFILE --exec $ DAEMON-$ DAEMON_ARGS

5
Mikel

私の人生では、なぜstart-stop-daemonが機能しないのか理解できませんでした... Debian 7.6 wheezyを実行していて、機能が無効になっているとしか想定できません。

/ dev/nullと&とvoilaを使用するように変更します-sciprtが起動し、期待どおりに動作し続けます... mysqlからコードを盗みました:

$prog > /dev/null 2>&1 &

誰かがこれが機能する理由を説明でき、元の解決策が説明できない場合、私は非常に興味があります...とにかく、私は私の経験を期待して共有することを考えました:

  1. 他の誰かを解決策でいじくり回す頭痛を救う
  2. 誰かにステップアップして、私が最初に望んだようにこれを機能させる方法を説明するように促します:)

編集|これが今注目している2行です

prog='/usr/bin/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'

start-stop-daemon --start --make-pidfile --background --oknodo --user $user --name $name --pidfile $pid --exec $prog
0
Alex.Barylski