我有一个python脚本,我使用此代码守护#
def daemonise():
from os import fork, setsid, umask, dup2
from sys import stdin, stdout, stderr
if fork(): exit(0)
umask(0)
setsid()
if fork(): exit(0)
stdout.flush()
stderr.flush()
si = file('/dev/null', 'r')
so = file('daemon-%s.out'%os.getpid(), 'a+')
se = file('daemon-%s.err'%os.getpid(), 'a+')
dup2(si.fileno(), stdin.fileno())
dup2(so.fileno(), stdout.fileno())
dup2(se.fileno(), stderr.fileno())
print 'this file has the output from daemon%s'%os.getpid()
print >> stderr, 'this file has the errors from daemon%s'%os.getpid()
脚本在
中while True: try: funny_code(); sleep(10); except:pass;
环。它可以运行几个小时然后意外死亡。我如何调试这些恶魔,错误的守护进程。
[编辑]
如果没有启动monit这样的进程,有没有办法在python中编写看门狗,可以看到我的其他守护进程并在它们出现故障时重新启动? (谁看着看门狗。)
答案 0 :(得分:3)
你真的应该使用python-daemon这是一个为标准守护程序进程库实现PEP 3141的库。这样,您将确保您的应用程序为其运行的任何类型的UNIX执行所有正确的操作。无需重新发明轮子。
答案 1 :(得分:1)
为什么你默默地吞下所有例外?试着看看这是什么例外:
while True:
try:
funny_code()
sleep(10)
except BaseException, e:
print e.__class__, e.message
pass
可能会发生导致其失败的意外情况,但你永远不会知道你是否盲目地忽略所有异常。
我建议使用supervisord(用Python编写,非常易于使用)来进行守护和监控过程。在supervisord下运行,您不必使用daemonise
函数。
答案 2 :(得分:0)
我在客户中使用的是daemontools。它是经过验证的,经过良好测试的工具,用于运行任何守护进程。
您只需在没有任何守护程序的情况下编写应用程序,即可在前台运行;然后为它创建一个daemontools服务文件夹,它将从现在开始发现并自动重启您的应用程序,并且每次系统重新启动时。
它还可以处理日志轮换和内容。节省了大量繁琐,重复的工作。