使用 start-stop-daemon 终止脚本的正确方法是什么?

使用 start-stop-daemon 终止脚本的正确方法是什么?

我正在使用 start-stop-daemon 为我的脚本制作 INIT 脚本。我使用 --make-pidfile 因为我的脚本没有生成自己的 pid。我可以使用 start 启动我的脚本,并且 pid 文件会生成适当的 PID。但 stop 功能不起作用。根据 start-stop-daemon 手册,

--stop 检查指定进程是否存在。如果存在这样的进程,start-stop-daemon 会向其发送由 --signal 指定的信号,并以错误状态 0 退出。如果不存在这样的进程,start-stop-daemon 会以错误状态 1(如果指定了 --oknodo,则为 0)退出。如果指定了 --retry,start-stop-daemon 将检查进程是否已终止。

我没有找到有关 --signal 本身的任何文档。例如,如果我想发送 SIGTERM,如何指定 --signal。

case "$1" in
  start|debug)
        log_daemon_msg "Starting $DESC: $NAME"
        start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE \
                --exec $DAEMON || log_failure_msg " already running"
        log_end_msg 0
        ;;
  stop)
        log_daemon_msg "Stopping $DESC: $NAME"
        start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE \
                --exec $DAEMON
        log_end_msg 0
        ;;

答案1

--signal可以使用数值,或者不带部分的信号名称SIG,例如--signal TERM

停止时不要使用--exec $DAEMON,因为如果您在升级过程中替换了可执行文件后尝试停止守护进程,则此方法不起作用:可执行文件与正在运行的进程不匹配,因此不会停止。或者,如果您坚持使用,--exec请确保在替换可执行文件之前停止守护进程。

如果创建的 pidfile 与守护进程的进程不匹配,那么守护进程本身可能也会分叉到后台。如果是这种情况,那么看看守护进程是否有选项可以阻止这种后台运行,因为start-stop-daemon已经处理好了这个问题。如果这不可能,请不要使用 pidfile 选项并依赖--exec(但请参阅上一段有关升级的内容)。

相关内容