Обработка сигналов в 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 стоп отсутствует файл syslog.

что я делаю не так?

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

1 ответов


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

def programCleanup(signum, frame):

цитирование документов (сигнал.signal ()):

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