Constantemente monitorea un programa / proceso usando Python
Estoy tratando de monitorear constantemente un proceso que es básicamente un programa Python. Si el programa se detiene, tengo que volver a iniciar el programa. Estoy usando otro programa de Python para hacerlo.
Por ejemplo, digamos que tengo que ejecutar constantemente un proceso llamadorun_constantly.py
. Inicialmente ejecuté este programa manualmente, el cual escribe su ID de proceso en el archivo "PID" (en la ubicación out / PROCESSID / PID).
Ahora corro otro programa que tiene lasiguiente código para monitorear el programarun_constantly.py
desde un entorno Linux:
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
No he incluido elcheckPID()
funciona aquicheckPID()
básicamente verifica si el ID del proceso todavía existe (es decir, si el programa aún se está ejecutando) y si no existe, devuelve0
. En el programa anterior, verifico sires == 0
, y si es así, entonces uso el programador de Python para programar el programa. Sin embargo, el principal problema al que me enfrento actualmente es que el ID de proceso de este programa y elrun_constantly.py
programase vuelve igual una vez que programe elrun_constantly.py
utilizando lascheduler.add_cron_job()
función. Así que si el programarun_constantly.py
se bloquea, el siguiente programa todavía piensa que elrun_constantly.py
se está ejecutando (ya que ambos ID de proceso son iguales), y por lo tanto continúa ingresando en el bucle else para dormir y monitorear nuevamente.
¿Alguien puede decirme cómo resolver este problema? ¿Existe una forma sencilla de monitorear constantemente un programa y reprogramarlo cuando se bloquea?