2009-10-21 75 views
1

我有一个python脚本,我daemonise使用此代码守护死亡意外

 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

你真的应该使用python-daemon这是一个为标准守护进程库实现PEP 3141的库。通过这种方式,您将确保您的应用程序为其所运行的任何类型的UNIX执行所有正确的操作。没有必要重新发明轮子。

0

我在客户中使用的是daemontools。这是一个经过验证的,经过充分测试的工具,可以运行任何守护程序。

您只需编写没有任何守护进程的应用程序即可在前台运行;然后为它创建一个daemontools服务文件夹,并且它会从现在开始发现并自动重新启动您的应用程序,并且每次系统重新启动。

它也可以处理日志的旋转和东西。节省了许多繁琐的重复性工作。

+0

我可能会添加一些像monit监视,但我想调试,为什么它失败如此频繁。 daemontools ...以及由djb编写的,所以我只是谨慎的配置它将要求。 :) – agiliq 2009-10-21 11:03:29

+0

@usaretech:不是这次 - 你只需创建一个名为“run”的脚本文件夹。这是一项服务。 – nosklo 2009-10-21 11:27:05

1

你为什么要默默地吞咽所有的异常?尝试看看异常被抓住这个什么:

while True: 
    try: 
     funny_code() 
     sleep(10) 
    except BaseException, e: 
     print e.__class__, e.message 
     pass 

意想不到的事情可能会发生,这是造成其失败,但你永远不会知道,如果你一味地忽略所有的异常。

我推荐使用supervisord(用Python编写,非常容易使用)进行守护进程和监视进程。在supervisord下运行,你不必使用你的daemonise函数。