2009-05-23 10 views
5

Necesito detectar cuando un programa se bloquea o no se está ejecutando con python y reiniciarlo. Necesito un método que no dependa necesariamente del hecho de que el módulo python sea el proceso principal.Sistema de reinicio automático en Python

estoy considerando implementar un bucle while que básicamente hace

ps -ef | grep process name 

y cuando no se encuentra el proceso comienza otra. Tal vez este no es el método más eficiente. Soy nuevo en Python, así que posiblemente haya un módulo de Python que ya lo haga.

Respuesta

5

¿Por qué implementarlo tú mismo? Una utilidad existente como daemon o Debian start-stop-daemon es más probable que tenga las otras cosas difíciles en cuanto a ejecutar procesos de servidor de larga duración.

De todos modos, cuando inicie el servicio, ponga su pid en /var/run/<name>.pid y luego realice su comando ps, solo busque la ID del proceso y verifique que sea el proceso correcto. En Linux, simplemente puede mirar /proc/<pid>/exe para verificar que apunta al ejecutable correcto.

+0

Debido a la naturaleza única del conjunto de programas que se está supervisando, no se pueden convertir en daemons. Por lo tanto, los métodos de monitoreo convencionales no están disponibles para mí. Además, necesito ciertas características en las que me sentiría más cómodo al implementarme en un módulo ordenado en lugar de confiar en el código externo. Gracias por la sugerencia/proc/ Caedis

0

No lo he probado, pero hay un módulo Python System Information que se puede usar para buscar procesos y obtener información sobre ellos. AFAIR hay una clase ProcessTable que se puede utilizar para inspeccionar los procesos en ejecución, pero no parece estar muy bien documentada ...

+0

Gracias! Voy a ver esto. – Caedis

0

Iré por la ruta de la línea de comandos (es más fácil en mi humilde opinión) Siempre que solo revise cada segundo o dos, el uso de los recursos debe ser infinitesimal en comparación con el procesamiento disponible en cualquier sistema de menos de 10 años.

+0

Probablemente lo haré, ya sea al analizar el comando ps o buscar en el directorio/proc. – Caedis

3

No reinventar init. Su sistema operativo tiene capacidades para hacer esto que no requieren casi ningún recurso del sistema y definitivamente lo harán mejor y de manera más confiable que cualquier cosa que pueda reproducir.

clásico Linux tiene/etc/inittab

Ubuntu ha /etc/event.d (recién llegado)

OS X ha launchd

Solaris ha smf

+0

Una vez más, la naturaleza única de los procesos que estoy monitoreando requiere que se manejen de forma diferente que un daemon simple. No puedo simplemente reiniciar los procesos, bloqueos de bases de datos, corrupción de datos del cliente. Los datos deben validarse antes de reiniciar el proceso del servidor. Entonces necesito codificar esto en python para evitar problemas serios. – Caedis

+0

o desea reinicios automáticos o no. Si lo hace, quiere que su sistema operativo lo haga a través de init, etc.Si no lo hace, entonces toda su pregunta y título expresa lo contrario de sus intenciones. – Dustin

1

El siguiente código comprueba una proceso dado en un intervalo dado, y lo reinicia.

#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() 
Cuestiones relacionadas