start-stop-daemon が期待どおりに動作しません。pid ファイルが書き込まれませんでした。

start-stop-daemon が期待どおりに動作しません。pid ファイルが書き込まれませんでした。

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

関連情報