2013-08-27 2 views
1

У меня есть демон, который я создал с помощью php. Я хочу, чтобы это было вызвано initscripts и запускалось при загрузке, что отлично работает. Однако, когда я пытаюсь убить процесс, используяphp и ошибка «start-stop-daemon: не удалось установить»

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 и мой код снова я понимаю, что ни в одном случае бы 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/УБИТЬ/5 --pidfile $ PIDFILE --name $ NAME
RETVAL = "$?" гт -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 означает, что программа мертва и/вар/блокировки файл блокировки существует

Кроме того, я не могу найти где-нибудь в/Lib/LSB/Init-функций, которые killproc() возвратит 2.

Принимая во внимание, 4 означает, что программа или состояние службы неизвестно