Python守护进程过早退出。其他一切都是如此

时间:2014-02-26 13:19:13

标签: python linux daemon

我对Python的守护进程模块的理解是,我可以拥有一个可以执行操作的脚本,生成一个守护进程,并继续执行操作。当脚本完成后,守护进程应该会挂起。是

但那没有发生......

我有一个python脚本,它使用curses来管理一大堆脚本和函数。它非常有效,除非我使用脚本生成一个守护进程。

现在,此应用程序中的守​​护程序由类表示。例如:

class TestDaemon(DaemonBase):
    def __init__(self,stuff):
        logger.debug("TestDaemon.__init__()")

    def run(self):
        logger.debug("TestDaemon entering loop")
        while True:
            pass

    def cleanup(self):
        super(TestDaemon,self).cleanup()
        logger.debug("TestDaemon.cleanup()")

    def load_config(self):
        super(TestDaemon,self).load_config()
        logger.debug("TestDaemon.load_config()")

守护进程的启动功能如下:

def launch(*args,**kwargs):
    import daemon
    import lockfile
    import signal
    import os

    oDaemon = TestDaemon(stuff)

    context = daemon.DaemonContext(
        working_directory=os.path.join(os.getcwd(),sAppName),
        umask=0o077, #chmod mode = 777 minus umask. Only current user has access
        pidfile=lockfile.FileLock('/home/sheena/.daemons/{0}__{1}.pid'.format(sAppName,sProcessName)),
    )

    context.signal_map = {
        signal.SIGTERM: oDaemon.cleanup,   #cleanup
        signal.SIGHUP: 'terminate',
        signal.SIGUSR1: oDaemon.load_config,   #reload config
    }


    logger.debug("launching daemon")

    with context:
        oDaemon.run()

    logger.debug("daemon launched")

该程序可以记录“启动守护程序”。

在此之后,所有内容都会退出,并且守护程序不会运行。

为什么会发生这种情况的任何想法?

没有例外的证据 - 设置了异常,但没有异常。

问题:为什么会发生这种情况的任何想法?

我试过的东西:

  • 如果我在try块中有oDaemon.run(),则它会以完全相同的方式失败
  • 我假设上下文设置错误,所以用with context替换with daemon.DaemonContext()。同样的问题
  • 我换了:

    with context: oDaemon.run()

def run():
    while True:
        pass
with context:
    run()

并且主程序仍然过早退出,但至少它产生了一个守护进程,所以我认为它不喜欢我把东西放在课堂上的方式......

1 个答案:

答案 0 :(得分:0)

我们对这个DaemonBase课程一无所知,但是这个:

with context:
    oDaemon.run()

是一个阻塞调用,因为run()中有无限循环。这就是为什么你的程序无法继续下去的原因。

启动实际守护程序进程的代码在哪里?