web-dev-qa-db-ja.com

start-stop-daemonが古いpidファイルを削除しない

アプリケーションをサービスとして起動および停止するために記述した初期化スクリプトがあります。コードはこちら:

#! /bin/bash
PID_FILE=/var/run/myservice.pid
case "$1" in
  start)
      echo "Starting up MyService..."
      start-stop-daemon --start -b -m --pidfile $PID_FILE --exec /usr/bin/Java -- -cp /path/to/jarfile.jar $CLASS_NAME --config /etc/myService/config.ini
      cat $PID_FILE
    ;;
  stop)
     echo "Stopping MyService..."
     start-stop-daemon --stop --signal KILL -b -m --pidfile $PID_FILE --exec /usr/bin/Java -- -cp /path/to/jarfile.jar $CLASS_NAME --config /etc/myService/config.ini
    ;;
  status)
    start-stop-daemon --status --pidfile $PID_FILE
    PROC_STATUS=$?
    echo $PROC_STATUS
    exit $PROC_STATUS
    ;;
esac

サービスは正常に開始および停止しますが、私が気づいている動作は、実行すると

Sudo service MyService stop

pidファイルは削除されません。サービスを開始または再起動しようとすると、これは成功です。新しいpidをpidファイルに書き込むだけです。サービスが適切に停止したときにpidファイルが削除されないのはなぜですか?

実際、start-stop-daemonはpidfileを削除するものではありません。スクリプトでそれを行うことができます(rm -f $pidfile)。他の起動スクリプトをご覧になることをお勧めします。たとえば、スクリプト/etc/init.d/dbusには、次のシャットダウンスクリプトがあります(do stopの場合):

shut_it_down()
{
  log_daemon_msg "Stopping $DESC" "$NAME"
  start-stop-daemon --stop --retry 5 --quiet --oknodo --pidfile $PIDFILE \
    --user $DAEMONUSER
  # We no longer include these arguments so that start-stop-daemon
  # can do its job even given that we may have been upgraded.
  # We rely on the pidfile being sanely managed
  # --exec $DAEMON -- --system $PARAMS
  log_end_msg $?
  rm -f $PIDFILE
}

マニュアルページから:

-m、--make-pidfile独自のpidファイルを作成しないプログラムを起動するときに使用されます。このオプションは、start-stop-daemonが--pidfileで参照されるファイルを作成し、プロセスを実行する直前にpidをそこに配置します。プログラムを停止してもファイルは削除されないことに注意してください。注:この機能はすべての場合に機能するとは限りません。最も顕著なのは、実行中のプログラムがメインプロセスから分岐する場合です。このため、通常は--backgroundオプションと組み合わせた場合にのみ有用です。

http://manpages.ubuntu.com/manpages/trusty/man8/start-stop-daemon.8.html を参照)

2
lemonslice