我試圖不斷監視一個基本上是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循環以再次進入休眠和監視狀態。
有人可以告訴我如何解決這個問題?是否有一種簡單的方法來持續監控程序並在程序崩潰時重新安排程序?
supervisord上+1。我使用它,它非常容易和跨平臺。 – jdi
@Mark Lakewood謝謝,Monit似乎很有趣,雖然它缺乏適當的文檔。它工作得很整潔 – Rkz