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"()を指定しないと、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

関連情報