start-stop-daemon无法正常工作,未写入pid文件


17

我正在尝试控制基于python的程序(不会与控制台分离)

#!/bin/bash

user=nobody
pid=/var/run/xx.pid
name=xx
prog=/xx.py

case $1 in
    start)
        /sbin/start-stop-daemon --start -b --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" --chuid nobody -- --daemon
        ;;
    stop)
        /sbin/start-stop-daemon --stop --oknodo --user "$user" --name "$name" --pidfile "$pid" --retry=TERM/5/KILL/1
        ;;
    restart)
        ;;
    *)
        ;;
esac

开始部分工作正常。我可以看到脚本已启动并正在运行,但是停止部分却没有。它只是说No xx found running; none killed.

所以我想开始部分有问题吗?

Answers:


22

start-stop-daemon --start --pidfile "$pid"除非指定--make-pidfile-m),否则不会写入pid文件。如果没有--make-pidfile它,则取决于要启动的程序来创建它。同样为了--make-pidfile正常工作,正在启动的进程无法自己守护(通过fork),因为这样一来,start-stop-daemon它将不知道应在文件中放置什么PID。

--pidfile "$pid"在您的使用场景中,唯一要做的是,start-stop-daemon如果该程序已经在运行,它将导致无法启动该程序。


如果进程仍未停止,则传递给的所有条件start-stop-daemon --stop必须匹配。含义$pid必须是正在运行的进程,该进程的UID必须匹配$user,并且进程名称(arg0)必须匹配$name
您可以通过执行以下操作确定arg0的值ps h -p $pid -o comm


好的,pidfile已写入。但是停止部分仍然无法正常工作,出现同样的错误消息
雏菊

@ warl0ck是正确的pid文件,并且进程的UID是否匹配$user
Patrick

是的,我看到start-stop-daemon尝试读取/proc/pid/statread(4, "5559 (python) S 1 5558 5558 0 -1"..., 1024) = 326,所以名称应该python改为?
雏菊2014年

完成后,将其替换为python它,并且起作用了;-P
雏菊

对,是的,$name也必须匹配。完全错过了您要传递的内容。将更新答案。
Patrick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.