1

我有一个使用 php 创建的守护进程。我想通过 initscripts 调用它并让它在启动时启动,这很好。但是,当我尝试使用终止进程时

sudo service crystal_send stop

它不会终止进程。

当我直接调用它时

start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /var/run/crystal/crystal_send.pid --exec /bin/crystal_send  

我明白了

start-stop-daemon: unable to stat /bin/crystal_send  (No such file or directory)

这是我的 /etc/init.d/crystal_send do_stop 函数的样子。

## /etc/init.d/crystal_send
NAME=crystal_send
DAEMON=/bin/$NAME
PIDFILE=/var/run/crystal/$NAME.pid

....


do_stop()       
{  
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DAEMON  
    RETVAL="$?"
    rm -f $PIDFILE
    [ "$RETVAL" = 2 ] && return 2

    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    rm -f $PIDFILE
    return "$RETVAL"
}
4

3 回答 3

0

After looking at dostrander's code and my code again I realize that in neither case would the pidfile or the lockfile be removed if the call to start-stop-daemon is successful. It might be better to remove them before calling start-stop-daemon. But after checking that the PID is correct.

        if [ $(sed -n '1p' < $PIDFILE) == $(pidof -x $NAME) ]; then
            rm -f $PIDFILE
            rm -f $LOCKFILE
    fi

    start-stop-daemon -K -q --retry=TERM/30/KILL/5 -n $NAME
    RETVAL="$?"
    printf "RETVAL is $RETVAL.\n"

    [ "$RETVAL" = 4 ] && return 4
于 2015-03-26T03:18:15.483 回答
0

多斯特兰德,

感谢这个发布。它帮助我解决了我遇到的一些问题。但我想知道如果

do_stop()       

{
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?" rm -f $PIDFILE [ "$RETVAL" = 4 ] && 返回 4

start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --name $NAME
[ "$?" = 4 ] && return 4
rm -f $PIDFILE
rm -f /var/lock/$NAME

return "$RETVAL"

}

会更好?

不是 2 意味着程序已死并且 /var/lock 锁定文件存在

此外,我在 /lib/lsb/init-functions 中找不到 killproc() 将返回 2 的任何地方。

而 4 表示程序或服务状态未知

于 2015-02-02T02:43:14.710 回答
0

好吧,来发现问题与 start-stop-daemon --stop 有关,特别是这
--exec $DAEMON
部分不是我应该使用的,我应该一直使用
--name $NAME. 这是因为 --exec 正在寻找一个命令并且守护进程是用 php(一种解释性语言)编​​写的,因此它实际上是在调用 php,然后它调用我的 php 程序(crystal_send),并且由于 start-stop-daemon 正在寻找一个命令/bin/crystal_send而不是/bin/php /bin/crystal_send它不会找到它。

因此,您应该让 start-stop-daemon 在进程表中查找名称,这就是我使用 --name $NAME 时所做的事情。

所以我最终的 do_stop 函数看起来像这样

## /etc/init.d/crystal_send
NAME=crystal_send
DAEMON=/bin/$NAME
PIDFILE=/var/run/crystal/$NAME.pid

....


do_stop()       
{  
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME  
    RETVAL="$?"
    rm -f $PIDFILE
    [ "$RETVAL" = 2 ] && return 2

    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --name $NAME
    [ "$?" = 2 ] && return 2
    rm -f $PIDFILE
    return "$RETVAL"
}
于 2013-08-27T20:55:15.800 回答