php和错误“start-stop-daemon:无法统计”

时间:2013-08-27 20:55:16

标签: php linux daemon start-stop-daemon

我有一个使用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"
}

3 个答案:

答案 0 :(得分: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"
}

答案 1 :(得分:0)

dostrander,

非常感谢。它帮助我解决了我遇到的一些问题。但我想知道是否

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 lock file存在

另外我在/ lib / lsb / init-functions中找不到killproc()会返回2。

4意味着程序或服务状态未知

答案 2 :(得分:0)

在再次查看dostrander的代码和我的代码之后,我意识到,如果对start-stop-daemon的调用成功,那么在任何情况下都不会删除pidfile或lockfile。在调用start-stop-daemon之前删除它们可能更好。但在检查PID是否正确后。

        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