アプリケーションをサービスとして起動および停止するために記述した初期化スクリプトがあります。コードはこちら:
#! /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 を参照)