2013-08-27 163 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指程序或服務的狀態未知