繁体   English   中英

Cron重新启动Python守护程序

[英]Cron Restarting A Python 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()

我可以使用以下命令在Terminal中启动它: python ./myDaemon.py start

有时,它会出于某种原因而突然退出。 因此,在myClass内部,每次成功运行时我都会编写一个文件。 用另一个脚本运行cron 1 * * * * python checkFile.py我查看脚本上一次成功运行的时间是否在300秒前。 如果大于我尝试重新启动守护程序。 这是我遇到麻烦的地方。

当我在终端窗口中使用以下python ./myDaemon.py start守护程序时: 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的输出(即使我假设上述的系统和子进程命令应该已经禁止了该操作)。 因此,守护程序启动,但是如果我关闭该窗口,则守护程序停止。

我要解决这个错误吗?

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

然后,该概念可能会简单得多:

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

受欢迎的守护程序管理器是:

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

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

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

结果,您的程序脚本将更加简单,并将重点放在要执行的任务上。 使它们继续运行的重复任务将留给解决方案,这些解决方案已经到位,并且调试时间比脚本长了几年。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM