Pythonベースのプログラムを制御しようとしています(コンソールから切り離されていません)。
#!/bin/bash
user=nobody
pid=/var/run/xx.pid
name=xx
prog=/xx.py
case $1 in
start)
/sbin/start-stop-daemon --start -b --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" --chuid nobody -- --daemon
;;
stop)
/sbin/start-stop-daemon --stop --oknodo --user "$user" --name "$name" --pidfile "$pid" --retry=TERM/5/KILL/1
;;
restart)
;;
*)
;;
esac
始めはうまくいきます。スクリプトが起動して実行されていることは確認できますが、停止している部分は表示されません。ただ話すNo xx found running; none killed.
では序盤に何か問題があるようですが?
答え1
start-stop-daemon --start --pidfile "$pid"
()を指定しないと、pidファイルは記録されません--make-pidfile
。存在しない-m
場合、--make-pidfile
起動されたプログラムはそれを作成します。また、これが機能するためには、開始--make-pidfile
されたプロセスをフォークを介して独自にデーモン化することはできません。なぜなら、start-stop-daemon
ファイルにどのPIDを入れるべきかわからないからです。
使用シナリオで実行できる唯一の作業は、プログラムが--pidfile "$pid"
すでに実行されている場合は起動に失敗することです。start-stop-daemon
プロセスがまだ停止しない場合は、渡されたすべての条件がstart-stop-daemon --stop
一致する必要があります。意味は$pid
実行中のプロセスでなければならず、プロセスのUIDが一致し、$user
プロセス名(arg0)が一致する必要があります$name
。
arg0 の値は次のように決定できます。ps h -p $pid -o comm