Cron重新启动Python守护进程

Cron重新启动Python守护进程,python,cron,subprocess,daemon,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' se

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

#!/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的输出(尽管我认为前面提到的系统和子流程命令应该已经抑制了该输出)。因此,守护进程启动,但如果我关闭该窗口,守护进程将停止

我做错了吗

更好地使用守护进程管理器 这个概念可以简单得多:

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

  • -非常适合运行简单脚本
  • -非常适合同时运行多个脚本
这两种方法都给了您一个在受控脚本停止运行时要求自动重新启动脚本的机会

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

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

更好地使用守护进程管理器 这个概念可以简单得多:

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

  • -非常适合运行简单脚本
  • -非常适合同时运行多个脚本
这两种方法都给了您一个在受控脚本停止运行时要求自动重新启动脚本的机会

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

因此,您的程序脚本将更加简单,并将重点放在要执行的任务上。让它们运行的重复任务将留给解决方案来完成,这些解决方案已经就位,并且调试的时间比脚本长几年