php和错误“;启动-停止守护进程:无法统计“;


php and error "start-stop-daemon: unable to stat"

我有一个使用php创建的守护进程。我想让initscript调用它,并在启动时启动它,这很好。然而,当我试图使用终止进程时

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"
}

在再次查看dostrander的代码和我的代码后,我意识到如果成功调用start-stop守护进程,在任何情况下都不会删除pidfile或lockfile。在调用start-stop守护进程之前,最好先删除它们。但在检查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

我们发现问题与启动-停止守护进程有关,特别是
--exec $DAEMON
部分不是我应该使用的,我应该使用
CCD_ 2。这是因为--exec正在寻找一个命令,而守护进程是用php(一种解释语言)编写的,因此它实际上正在调用php,然后它调用我的php程序(crystal_send),并且由于start-stop守护进程正在寻找命令/bin/crystal_send而不是/bin/php /bin/crystal_send,所以它找不到它。

因此,您应该让start-stop守护进程在进程表中查找名称,这就是我在使用--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"
}

dostrander,

谢谢你投毒。它帮助我解决了一些问题。但我想知道

do_stop()       


start-stop守护进程--stop--quiet--retry=TERM/30/KILL/5--pidfile$pidfile--name$name
RETVAL="$?"rm-f$PIDFILE["$RETVAL"=4]&amp;返回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函数中找不到killproc()会返回2的任何地方。

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