2014-01-18 3 views
8

Я установил python-daemon, и теперь я пытаюсь правильно обработать сигнал. Мой код:Обработка сигналов в python-daemon

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import signal, time, syslog 
import daemon 

def runDaemon(): 
    context = daemon.DaemonContext() 

    context.signal_map = { signal.SIGTERM: programCleanup } 

    context.open() 
    with context: 
     doMainProgram() 

def doMainProgram(): 
    while True: 
     syslog.syslog("pythonDaemon is running") 
     time.sleep(5) 

def programCleanup(): 
    syslog.syslog("pythonDaemon STOP") 

if __name__ == "__main__": 
    runDaemon() 

Когда я начинаю код все работает, как ожидалось: Текст pythonDaemon работает получает записывается /var/log/syslog каждые 5 секунд. Но когда я хочу завершить демона с помощью kill -TERM *PID*, демон завершается, но текст pythonDaemon STOP отсутствует в syslog.

Что я делаю неправильно?

NB: Я не работаю с from daemon import runner здесь, потому что это дает мне ошибку (похоже, мне нужна более старая версия lockfile), и я не буду исправлять это, если только это не позволяет получить правильную обработку сигналов ,

ответ

8

Ваш код выглядит отлично, за исключением того, что обработчик сигнала не вызывается, потому что он имеет неправильную подпись. Сделать это следующим образом:

def programCleanup(signum, frame): 

Цитирование документы (signal.signal()):

Обработчик вызывается с двумя аргументами: номер сигнала и текущий кадр стека

Смежные вопросы