Constantemente monitorea un progtwig / proceso usando Python

Estoy tratando de monitorear constantemente un proceso que es básicamente un progtwig Python. Si el progtwig se detiene, tengo que volver a iniciar el progtwig. Estoy usando otro progtwig de Python para hacerlo.

Por ejemplo, digamos que tengo que ejecutar constantemente un proceso llamado run_constantly.py . Inicialmente ejecuté este progtwig manualmente, el cual escribe su ID de proceso en el archivo “PID” (en la ubicación out / PROCESSID / PID).

Ahora ejecuto otro progtwig que tiene el siguiente código para monitorear el progtwig run_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 la función checkPID() aquí. checkPID() básicamente verifica si el ID del proceso todavía existe (es decir, si el progtwig todavía se está ejecutando) y si no existe, devuelve 0 . En el progtwig anterior, verifico si res == 0 , y si es así, uso el progtwigdor de Python para progtwigr el progtwig. Sin embargo, el principal problema al que me enfrento actualmente es que el ID de proceso de este progtwig y el progtwig run_constantly.py vuelven iguales cuando programo el run_constantly.py usando la función scheduler.add_cron_job() . Por lo tanto, si el progtwig run_constantly.py bloquea, el siguiente progtwig aún piensa que run_constantly.py está ejecutando (ya que ambas identificaciones de proceso son iguales) y, por lo tanto, continúa 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 progtwig y reprogtwigrlo cuando se bloquea?

Hay muchos progtwigs que pueden hacer esto.

En Ubuntu hay upstart (instalado por defecto)

Mucha gente como http://supervisord.org/

monit como lo menciona @nathan

Si está buscando una alternativa de python, hay una biblioteca que acaba de publicarse llamada circo y que parece interesante.

Y casi todas las distribuciones de Linux tienen probablemente una de estas incorporadas.

La elección depende realmente de cuál te guste más, pero sería mucho mejor usar uno de estos que escribirlo tú mismo.

Espero que ayude

Si está dispuesto a controlar el progtwig supervisado directamente desde python en lugar de usar cron, consulte el módulo de subproceso :

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

Verifique ejemplos y haga un seguimiento del estado del proceso con Python en SO para obtener ejemplos y referencias.

Puedes usar monit http://mmonit.com/monit/

Supervisa los procesos y los reinicia (y otras cosas).