【问题标题】:Cron Restarting A Python DaemonCron 重启 Python 守护进程
【发布时间】:2014-07-31 22:17:09
【问题描述】:

我有一个简单的守护程序脚本:

#!/usr/bin/python
from myClass import theClass
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/foo.pid'
        self.pidfile_timeout = 5
    def run(self):
        while True:
            print 'run'
            classObj = theClass()
            classObj.run()

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

我可以在终端中使用:python ./myDaemon.py start

无论什么原因,它都会时不时地拉出来。因此,在 myClass 中,每次成功运行时我都会编写一个文件。另一个脚本从 cron 运行,例如; 1 * * * * python checkFile.py我看看脚本最后一次成功运行是否是> 300秒前。如果它大于我尝试重新启动我的守护进程。这就是我遇到麻烦的地方。

当我在终端窗口中使用:python ./myDaemon.py start 启动守护程序时,我可以关闭窗口并继续我的业务,​​守护程序将继续运行。但是,(这是我不太了解的地方)如果我尝试使用os.system('python ./myDaemon.py start > /dev/null') 或使用子进程从我的checkFile.py 脚本中启动myDaemon.py:

proc = subprocess.Popen(['python','myDaemon.py','start'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = proc.communicate()

我没有成功。我从终端窗口手动运行checkFile.py 并看到了 myClass 输出(即使我假设上述系统和子进程命令应该已经抑制了它)。所以,守护进程启动,但如果我关闭该窗口,守护进程就会停止。

我做错了吗?

【问题讨论】:

    标签: python cron subprocess daemon


    【解决方案1】:

    更好地使用守护进程管理器

    这个概念可以简单得多:

    • 所有(程序)脚本都在前台运行(禁止守护进程)
    • 守护进程由某个守护进程管理器控制。

    流行的守护进程管理器是:

    • zdaemon - 非常适合运行简单的脚本
    • supervisor - 非常适合同时运行多个脚本

    两者都让您有机会要求自动重启受控脚本,以防它们停止运行。

    两者还允许将脚本打印的内容捕获到 stdout 和 stderr 并将它们保存在日志文件中。

    因此,您的程序脚本会简单得多,并且会专注于要完成的任务。保持它们运行的​​重复任务将留给解决方案,这些解决方案比您的脚本多几年的时间和调试时间。

    【讨论】: