守护进程意外死亡

时间:2009-10-21 09:53:35

标签: python daemon

我有一个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中编写看门狗,可以看到我的其他守护进程并在它们出现故障时重新启动? (谁看着看门狗。)

3 个答案:

答案 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服务文件夹,它将从现在开始发现并自动重启您的应用程序,并且每次系统重新启动时。

它还可以处理日志轮换和内容。节省了大量繁琐,重复的工作。