2013-08-27 165 views
1

我有一个守护程序,我已经创建使用PHP。我想通过initscripts调用它,并在启动时启动,这很好。然而,当我试图杀死使用的进程PHP和错误“启动 - 停止守护进程:无法统计”

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

回答

0

看着dostrander的代码后,我的代码,我再次认识到,在两种情况下会如果调用start-stop-daemon的是pidfile进程文件或锁文件被删除成功的。在调用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 
0

那么就来了解一下这个问题已经做的起止守护--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" 
} 
0

dostrander,

感谢这个poisting。它帮助我解决了我遇到的一些问题。但我不知道是否

do_stop()  

{
启动 - 停止 - 守护--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 /锁锁文件存在

我也不能在/ lib/LSB /初始化函数任何地方,killproc()将返回2

找到

而一个4指程序或服务的状态未知