2009-05-23 62 views
5

我需要檢測程序崩潰或不在使用python運行並重新啓動它。我需要一個不一定依賴作爲父進程的python模塊的方法。Python中的自動重啓系統

我正在考慮實施一個while循環,基本上不

ps -ef | grep process name 

,並在過程中沒有發現它開始另一個。也許這不是最有效的方法。我是python新手,所以可能有一個python模塊已經這樣做了。

回答

5

爲什麼要自己實施它?像daemon或Debian的start-stop-daemon這樣的現有實用程序更有可能讓其他困難的東西正確地運行長期生活的服務器進程。

無論如何,當您啓動服務時,請將其pid放入/var/run/<name>.pid,然後讓您的ps命令只查找該進程ID,並檢查它是否是正確的進程。在Linux上,您只需查看/proc/<pid>/exe以檢查它是否指向正確的可執行文件。

+0

由於被監控的程序集的獨特性,它們不能被製作守護進程。因此傳統的監測方法對我來說是不可用的此外,我需要某些功能,使我能夠更輕鬆地在一個漂亮整潔的模塊中實現自己,而不是依靠外部代碼。 感謝/ proc/ Caedis 2009-05-23 19:14:52

0

我自己還沒有嘗試過,但有一個Python System Information模塊可用於查找進程並獲取有關它們的信息。 AFAIR有一個ProcessTable類,可以用來檢查正在運行的進程,但它似乎沒有很好的記錄...

+0

謝謝!我會研究這個。 – Caedis 2009-05-23 19:15:33

0

我會去命令行路由(它只是更容易imho)作爲只要您每隔一兩秒鐘檢查一次,資源使用率應該小於10年前的任何系統上的可用處理量。

+0

我可能會通過解析ps命令或搜索/ proc目錄。 – Caedis 2009-05-23 19:22:01

3

請不要重新初始化init。您的操作系統具有這樣的功能,幾乎不需要系統資源,並且一定會做得更好,而且比任何可以複製的都更可靠。

經典Linux有/ etc/inittab中

Ubuntu已經/etc/event.d(暴發戶)

OS X已的launchd

的Solaris已SMF

+0

同樣,我監視的進程的獨特性質要求它們的處理方式與簡單守護進程不同。我不能簡單地讓進程重新啓動,數據庫鎖定,客戶端數據損壞。數據必須在重新啓動服務器進程之前進行驗證。所以我需要自定義代碼到Python來防止嚴重的問題。 – Caedis 2009-05-23 19:50:21

1

下面的代碼檢查一個在給定的時間間隔內給定進程,並重新啓動它。

#Restarts a given process if it is finished. 
#Compatible with Python 2.5, tested on Windows XP. 
import threading 
import time 
import subprocess 

class ProcessChecker(threading.Thread): 
    def __init__(self, process_path, check_interval): 
     threading.Thread.__init__(self) 
     self.process_path = process_path 
     self.check_interval = check_interval 

    def run (self): 
     while(1): 
      time.sleep(self.check_interval) 
      if self.is_ok(): 
       self.make_sure_process_is_running() 

    def is_ok(self): 
     ok = True 
     #do the database locks, client data corruption check here, 
     #and return true/false 
     return ok 

    def make_sure_process_is_running(self): 
     #This call is blocking, it will wait for the 
     #other sub process to be finished. 
     retval = subprocess.call(self.process_path) 

def main(): 
    process_path = "notepad.exe" 
    check_interval = 1 #In seconds 
    pm = ProcessChecker(process_path, check_interval) 
    pm.start() 
    print "Checker started..." 

if __name__ == "__main__": 
    main()