start-stop-daemon 不会删除旧的 pid 文件

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 文件未被删除?

答案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

相关内容