我正在使用 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
(但请参阅上一段有关升级的内容)。