我编写了一个初始化脚本,用于启动和停止作为服务的应用程序。代码如下:
#! /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 文件未被删除?
答案1
实际上start-stop-daemon
不应该删除 pidfile。您可以在脚本中执行此操作(rm -f $pidfile
)。您可能想看看其他启动脚本。/etc/init.d/dbus
例如,该脚本具有以下关闭脚本(用于执行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)