Cron重启Python守护进程

时间:2014-06-11 00:49:22

标签: python cron subprocess daemon

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

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

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

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

我是不是错了?

1 个答案:

答案 0 :(得分:4)

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

这个概念可以简单得多:

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

热门守护程序管理员是:

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

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

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

因此,您的程序脚本将更加简单,并将专注于要执行的任务。保持它们运行的​​重复任务将留给解决方案,这些解决方案已经到位并且比脚本调试了几年。