1

我正在尝试在 python 中创建一个守护程序服务,并使用日志记录到文件选项。如果我将 pidfile 参数添加到 daemon.DaemonContext 构造函数,则 logger 不会将任何消息记录到 logger.log 文件中。但是,如果我删除该参数,一切正常。运行没有任何错误。谁能知道为什么 daemon.DaemonContext 中的 pidfile 参数禁用日志消息?我该如何解决?

任何帮助将不胜感激。谢谢

import signal
import daemon
import lockfile
import logging
import logging.handlers

def run():

    logger = logging.getLogger("DaemonLog")
    logger.setLevel(logging.INFO)
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    logger.addHandler(handler)

    daemon_context = daemon.DaemonContext(
        working_directory='/opt/myDaemon',
        umask=0o002,
        pidfile=lockfile.FileLock('/var/run/myDaemon.pid'),
        files_preserve=[handler.stream]
    )
    daemon_context.signal_map = {
        signal.SIGTERM: terminate_collector,
        signal.SIGHUP: terminate_collector,
        signal.SIGABRT: terminate_collector
    }

    with daemon_context as context:
        while True:
            logger.info("log")
            func()
            time.sleep(PARAM_SLEEP)

if __name__ == "__main__":
    run()
4

1 回答 1

1

我成功解决了问题。问题是没有使用以下命令创建 pidfile:

pidfile=lockfile.FileLock('/var/run/myDaemon.pid')

解决方案是使用 daemon.pidfile 模块而不是 lockfile 模块:

pidfile=daemon.pidfile.PIDLockFile('/var/run/myDaemon.pid')

完整代码解决方案:

import signal
import daemon
import daemon.pidfile
import lockfile
import logging
import logging.handlers

def run():

    logger = logging.getLogger("DaemonLog")
    logger.setLevel(logging.INFO)
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    logger.addHandler(handler)

    daemon_context = daemon.DaemonContext(
        working_directory='/opt/myDaemon',
        umask=0o002,
        pidfile=daemon.pidfile.PIDLockFile('/var/run/myDaemon.pid'),
        files_preserve=[handler.stream]
    )
    daemon_context.signal_map = {
        signal.SIGTERM: terminate_collector,
        signal.SIGHUP: terminate_collector,
        signal.SIGABRT: terminate_collector
    }

    with daemon_context as context:
        while True:
            logger.info("log")
            func()
            time.sleep(PARAM_SLEEP)

if __name__ == "__main__":
    run()
于 2016-08-10T08:17:25.657 回答