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"
--make-pidfile
( -m
) が指定されていない限り、pid ファイルに書き込みません。--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