Python守护进程被抓住了

时间:2017-05-23 19:01:05

标签: python logging daemon python-daemon

我正在编写一个脚本来读取系统日志,并且在守护它时遇到了问题。它随意挂起,我不能为我的生活找出原因。这是代码:

守护程序

daemon_context = daemon.DaemonContext(files_preserve=[fh.stream])
with daemon_context:
    logger.debug("In Daemon")
    main()

主要

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("./debug.log")
logger.addHandler(fh)
logger.debug("First")

def main():
    while True:
        from schema import parsed, engine, session
        logger.debug("Main Loop")
        logger.debug(args)

        if args.filename is None:
            logger.debug("In If")
            with open("/absolute/path/to/log.log") as f:
                readlines = f.readlines()
                logger.debug(readlines)
            content = [x.split() for x in readlines]
            logger.debug(content)
        else:
            logger.debug("In Else")
            with open(args.filename) as f:
                readlines = f.readlines()
                logger.debug(readlines)
            content = [x.split() for x in readlines]
            logger.debug(content)

        logger.debug("After Ifs")

        conn = engine.connect()
        logger.debug(conn)
        rows = session.query(parsed).count()

        for entry in range(rows, len(content)):
        # Code inside this for loop is unimportant to the problem at hand

登录

我正在记录所有内容,因为我要找出错误被捕获的位置。

当我使用python3 test.py --filename access.log运行时,我得到:

First
In Daemon
Main Loop
Namespace(filename='access.log')
In Else

那是整个日志。它就此停止。

但如果我运行python3 test.py,没有文件名参数,那么我得到这个日志:

First
In Daemon
Main Loop
Namespace(filename=None)
In If
[]
[]
After Ifs
<sqlalchemy.engine.base.Connection object at 0x7fe11c1da5f8>

然后它无限重复,直到我停止任务。

我无法弄清楚为什么它会停止。如果有人可以帮助我,那就太好了。在尝试使用python-daemon之前,我有一个不同形式的此脚本。所以我知道底层逻辑应该是合理的。

1 个答案:

答案 0 :(得分:0)

daemon_context = daemon.DaemonContext(files_preserve=[fh.stream])
with daemon_context:

不同
with daemon.DaemonContext(files_preserve=[fh.stream]) as daemon_context:

我也不确定你的记录器,即全局变量,在守护进程中是否能够在主进程死亡后继续存在。您是否尝试在main()内初始化它?