1

我一直在按照这个例子来实现一个 python 守护进程,它似乎有点工作,但只调用了 reconfigure 函数。

这是我一直在使用的代码:

import signal
import daemon
import lockfile

import manager

context = daemon.DaemonContext(
    working_directory='/home/debian/station',
    pidfile=lockfile.FileLock('/var/run/station.pid'))

context.signal_map = {
    signal.SIGTERM: manager.Manager.program_terminate,
    signal.SIGHUP: 'terminate',
    signal.SIGUSR1: manager.Manager.program_reload_configuration,
    }

manager.Manager.program_configure()

with context:
    manager.Manager.program_start()

这是管理器类的代码:

@staticmethod
def program_configure():
    logging.info('Configuring program')

@staticmethod
def program_reload_configuration():
    logging.info('Reloading configuration')

@staticmethod
def program_start():
    global Instance
    logging.info('Program started')
    Instance = Manager()
    Instance.run()

@staticmethod
def program_terminate():
    logging.info('Terminating')

日志仅显示:

INFO:root:Configuring program

由于某种原因program_start()没有被调用。 program_configure()每次读取python文件时都会调用它,就是这样,但是为什么不program_start()调用呢?

我通过键入启动守护程序sudo service station.sh start,运行脚本的行是:

python $DAEMON start

编辑:读了一点之后,我意识到程序可能退出或挂起context.__enter__()with调用)。但我不知道是什么原因造成的

4

1 回答 1

0

问题不在于 python-daemon 没有调用函数,而是日志记录不起作用。

当守护进程创建一个新进程时,它不会从母进程传输所有文件句柄 - 因此不会写入日志。有关更多信息,请参阅此问题

解决方案是files_preserve像这样使用该属性:

# Set the logger
LOG_LEVEL = logging.DEBUG
logger = logging.getLogger()
logger.setLevel(LOG_LEVEL)
fh = logging.FileHandler(LOG_FILENAME)
logger.addHandler(fh)

# Not create the context, and notify it to preserve the log file
context = daemon.DaemonContext(
    working_directory='/home/debian/station',
    pidfile=lockfile.FileLock('/var/run/station.pid'),
    files_preserve=[fh.stream],
)
于 2016-03-24T10:48:49.007 回答