2009-10-21 90 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函數。