pythondaemon不调用start函数

2024-04-25 11:34:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在跟踪this example来实现一个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()

以下是manager类的代码:

^{pr2}$

日志只显示:

INFO:root:Configuring program

由于某些原因,program_start()没有被调用。 program_configure()在每次读取python文件时都被调用,所以就是这样,但是为什么不调用{}?在

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

python $DAEMON start

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


Tags: 代码importsignalconfigurewithcontextmanager原因
1条回答
网友
1楼 · 发布于 2024-04-25 11:34:29

问题不在于python守护进程没有调用函数,而是日志记录不起作用。在

当守护进程创建一个新进程时,它不会从主进程传输所有文件句柄,因此不会写入日志。有关详细信息,请参见this question。在

解决方法是使用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],
)

相关问题 更多 >

    热门问题