我有一个简单的守护程序脚本:
#!/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输出(即使我假设前面提到的系统和子进程命令应该已经抑制了)。因此,守护进程启动,但是如果我关闭该窗口,守护进程就会停止。
我是不是错了?
答案 0 :(得分:4)
这个概念可以简单得多:
热门守护程序管理员是:
两者都让你有机会要求自动重启受控脚本以防止它们停止运行。
两者都允许将脚本打印的内容捕获到stdout和stderr,并将它们保存在日志文件中。
因此,您的程序脚本将更加简单,并将专注于要执行的任务。保持它们运行的重复任务将留给解决方案,这些解决方案已经到位并且比脚本调试了几年。