2016-03-15 6 views
1

Я написал собственный демон python, который запускается как служба через скрипт init.d на ubuntu 14.04. Запуск службы работает нормально, но когда я пытаюсь сделать «остановку сервисного монитора», демон не прерывается. Я использую pyinotify для демонстрации наблюдателя файлов для изменений.пользовательский linux-демон не перестает использовать «service stop»

В init.d скрипт:

PATH=/sbin:/usr/sbin:/bin:/usr/bin 
DESC="Monitor files" 
NAME=monitor 
DAEMON=/usr/bin/python 
DAEMON_ARGS="/home/user/python/monitor.py" 
PIDFILE=/home/user/logs/monitor.pid 
LOGFILE=/home/user/logs/monitor.log 
SCRIPTNAME=/etc/init.d/$NAME 

...

do_stop() 
{ 
    # Return 
    # 0 if daemon has been stopped 
    # 1 if daemon was already stopped 
    # 2 if daemon could not be stopped 
    # other if a failure occurred 
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 
    RETVAL="$?" 
    # Many daemons don't delete their pidfiles when they exit. 
    rm -f $PIDFILE 
    return "$RETVAL" 
    echo "done" 
} 

...

case "$1" in 
    start) 
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 
    do_start 
    case "$?" in 
      0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
      2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
    esac 
    ;; 
    stop) 
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" 
    do_stop 
    case "$?" in 
      0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
      2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
    esac 
    ;; 

...

Чтобы ручки демона SIGERM правильно, я могу запустить его вручную:

bash$ /usr/bin/python /home/user/python/monitor.py 
bash$ kill -Term PID 

Демон успешно обрабатывает SIGTERM и выходит должным образом.

Я не могу понять, почему он не справляется с этим, когда я делаю «остановку сервисного монитора».

+0

Пока он работает, имеет ли 'PIDFILE' правильный идентификатор процесса? Из примера вашей командной строки это выглядит так: 'monitor.py' превращается в фоновый процесс, поэтому' start-stop-daemon' может записывать неправильный PID –

+0

. В моем предыдущем комментарии предполагается, что 'start-stop-daemon' был сказал '--make-pidfile', так как иначе это' monitor.py', чтобы записать его. ('do_start' не находится в вопросе) –

+0

Да, это правильно, программа python превращается в фоновый процесс, а PID в PIDFILE соответствует PID процесса. И да, он делает свой собственный PIDFILE в программе python. –

ответ

0

Проверьте правильность процесса $NAME, который доставлен в команду start-stop-daemon --stop. Я просто столкнулся с этой проблемой, потому что процесс, который я запускал, получал другое имя, когда он разветвлял его демон. Попробуйте выполнить это, чтобы увидеть имя команды процесса:

ps -o comm= $(cat /home/user/logs/monitor.pid) 

Я держал пари, ваш выводит это (вместо monitor):

python 

Затем измените команду остановки, чтобы посмотреть, как это, где вы заменяете python в место $NAME:

start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name python 
+0

Да, ты на 100% прав. Этот процесс был переименован в python. Ваше предложение исправляет это. В качестве продолжения можно добавить «python» после - name конфликта с каким-либо другим системным процессом? Есть ли лучшая практика для правильного имени моего демона? –

+0

Возможно, вы ищете что-то вроде [this] (http://stackoverflow.com/questions/564695/is-there-a-way-to-change-effective-process-name-in-python). Возможно, это не стоило бы всех усилий; если ваш '$ PIDFILE' должным образом защищен (не записывается ненадежными пользователями), тогда риск должен быть довольно низким, чтобы вы могли убить неправильный процесс на основе Python. Пока '$ PIDFILE' живет в'/var/run' (обычно это tmpfs), он перезагружается при перезагрузке, что еще больше уменьшит шансы. –

+0

Полезно знать, спасибо! –