2012-11-28 40 views
5

我試圖不斷監視一個基本上是Python程序的進程。如果程序停止,那麼我必須再次啓動程序。我正在使用另一個Python程序來執行此操作。使用Python持續監視程序/進程

例如,假設我必須不斷運行名爲run_constantly.py的進程。我最初手動運行該程序,將其進程ID寫入文件「PID」(位於out/PROCESSID/PID中)。

現在我運行另一個程序,它具有下面的代碼從Linux環境監測方案run_constantly.py

def Monitor_Periodic_Process(): 

    TIMER_RUNIN = 1800 
    foo = imp.load_source("Run_Module","run_constantly.py") 
    PROGRAM_TO_MONITOR = ['run_constantly.py','out/PROCESSID/PID'] 
    while(1): 
     # call the function checkPID to see if the program is running or not 
     res = checkPID(PROGRAM_TO_MONITOR) 
     # if res is 0 then program is not running so schedule it 
     if (res == 0): 
      date_time = datetime.now() 
      scheduler.add_cron_job(foo.Run_Module, year=date_time.year, day=date_time.day, month=date_time.month, hour=date_time.hour, minute=date_time.minute+2) 
      scheduler.start() 
      scheduler.get_jobs() 
      time.sleep(TIMER_NOT_RUNIN) 
      continue 
     else: 
      #the process is running sleep and then monitor again 
      time.sleep(TIMER_RUNIN) 
      continue 

我這裏沒有包括checkPID()功能。 checkPID()基本上檢查進程ID是否仍然存在(即如果程序仍在運行)並且如果它不存在,則返回0。在上面的程序中,我檢查是否res == 0,如果是的話,那麼我使用Python的調度程序來安排程序。然而,我目前面臨的主要問題是,一旦我使用scheduler.add_cron_job()函數安排run_constantly.py,該程序的進程ID和run_constantly.py程序變爲相同。因此,如果程序run_constantly.py崩潰,則以下程序仍認爲run_constantly.py正在運行(因爲兩個進程ID都相同),因此繼續進入else循環以再次進入休眠和監視狀態。

有人可以告訴我如何解決這個問題?是否有一種簡單的方法來持續監控程序並在程序崩潰時重新安排程序?

回答

6

有許多程序可以做到這一點。

在Ubuntu上有upstart(默認安裝)

許多人喜歡http://supervisord.org/

monit由@nathan

提到如果你正在尋找一個替代蟒蛇有一個庫,剛剛發佈,名爲circus,看起來很有趣。

而且幾乎每一個Linux發行版可能已建成的這些1英寸

的選擇真的只是下降到你喜歡哪一個更好,但你會使用其中的一個比你寫它好得多。

希望幫助

+0

supervisord上+1。我使用它,它非常容易和跨平臺。 – jdi

+0

@Mark Lakewood謝謝,Monit似乎很有趣,雖然它缺乏適當的文檔。它工作得很整潔 – Rkz

1

你可以只使用monit的 http://mmonit.com/monit/

它可以監控流程,並重新啓動它們(和其他的東西。)

+0

monit可以做很多有用的想法。 – crow16384

+0

但無論如何,你的調度程序如何運行應用程序?從代碼示例中不清楚。要解決PID問題,您已在系統中正確運行。 – crow16384

2

如果你願意直接從蟒蛇而不是使用cron的控制被監控程序,必須看看subprocess module:對SO的例子

The subprocess module allows you to spawn new processes, 
connect to their input/output/error pipes, and obtain their return codes. 

檢查例子像track process status with python和參考文獻。