Pregunta

necesito para detectar cuando un programa se bloquea o no se está ejecutando utilizando Python y reiniciarlo. Necesito un método que no necesariamente se basan en el módulo de Python es el proceso padre.

Estoy considerando la implementación de un bucle while que esencialmente 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 hay un módulo de Python que hace esto ya.

¿Fue útil?

Solución

¿Por qué implementar por sí mismo? Una utilidad de existir como demonio o start-stop-daemon de Debian es más probable conseguir las otras cosas difíciles acerca de la ejecución correcta del servidor de tiempo de vida procesos.

De todos modos, cuando se inicia el servicio, puesto su pid en /var/run/<name>.pid y luego hacer su comando ps sólo tiene que buscar el ID de proceso, y comprobar que es el proceso correcto. En Linux se puede simplemente mirar /proc/<pid>/exe para comprobar que apunte al ejecutable derecha.

Otros consejos

Por favor, no reinventar init. Su sistema operativo tiene la capacidad de hacer esto que requieren casi sin recursos del sistema y sin duda lo hará mejor y más fiable que cualquier cosa que pueda reproducirse.

Classic Linux tiene / etc / inittab

Ubuntu ha /etc/event.d (advenedizo)

OS X ha launchd

Solaris ha smf

El siguiente código comprueba un 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()

No he probado a mí mismo, pero no es un módulo de Python información del sistema que se puede utilizar para encontrar procesos y obtener información sobre ellos. AFAIR hay una clase ProcessTable que se puede utilizar para controlar los procedimientos de funcionamiento, pero no parece estar muy bien documentado ...

Me gustaría ir la ruta de línea de comandos (es sólo mi humilde opinión más fácil), siempre y cuando sólo se comprueba cada segundo o dos el uso de los recursos debe ser infinitesimal comparado con el procesamiento disponible en cualquier sistema con menos de 10 años de edad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top