11

我安装了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

我究竟做错了什么?

注意:我不在from daemon import runner这里工作,因为这给了我一个错误(看起来我需要一个旧版本的lockfile),除非它是正确处理信号的唯一可能性,否则我不会解决这个问题。

4

1 回答 1

11

您的代码看起来不错,除了没有调用信号处理程序,因为它具有错误的签名。让它像这样:

def programCleanup(signum, frame):

引用文档(s​​ignal.signal()):

使用两个参数调用处理程序:信号编号和当前堆栈帧

于 2014-01-18T22:24:57.080 回答