2010-04-26 26 views
5

Este post describe cómo mantener un proceso hijo viva en un script bash:¿Cómo se puede reiniciar automáticamente una secuencia de comandos python en caso de error?

How do I write a bash script to restart a process if it dies?

Esto funcionó muy bien para llamar a otro script BASH.

Sin embargo, he intentado ejecutar algo similar en el que el proceso hijo es un script en Python, daemon.py que crea un proceso hijo bifurcado que se ejecuta en segundo plano:

#!/bin/bash 

PYTHON=/usr/bin/python2.6 

function myprocess { 


$PYTHON daemon.py start 

} 
NOW=$(date +"%b-%d-%y") 

until myprocess; do 
    echo "$NOW Prog crashed. Restarting..." >> error.txt 
    sleep 1 
done 

Ahora el comportamiento es completamente diferente. Parece que el script de python ya no es un elemento secundario del script bash, pero parece que 'se hizo cargo' de los scripts de BASH PID, por lo que ya no existe un BASH wrapper alrededor del script llamado ... ¿por qué?

+3

Sería de gran ayuda para saber qué hay en daemon.py, pero a partir del nombre que supongo que lo hace un "ejecutivo" o lo que es equivalente a la pitón para ponerse a un segundo plano. –

+0

... W h a t? –

+0

editado para describir daemon.py – chris

Respuesta

5

Un proceso daemon se bifurca, como el punto clave de demonización, por lo que el PID que tiene el proceso principal no tiene ningún valor (se va muy pronto después de que se inició el proceso secundario).

Por lo tanto, un proceso daemon debe escribir su PID en un archivo en un "lugar conocido" donde, por convención, el proceso padre sabe desde dónde leerlo; con este enfoque (tradicional), el proceso principal, si quiere actuar como un perro guardián de reinicio, simplemente puede leer el PID del proceso daemon desde la ubicación conocida y periódicamente verificar si el daemon aún está vivo, y reiniciarlo cuando sea necesario.

Por supuesto, se requiere cierto cuidado en la ejecución (un PID "obsoleto" permanecerá en el archivo "ubicación conocida" durante un tiempo y el padre debe tenerlo en cuenta), y hay posibles variantes (el daemon podría emitir un "latido" para que el padre pueda detectar no solo demonios muertos, sino también "atrapados para siempre", por ejemplo, debido a un punto muerto, ya que dejan de emitir su "latido" [a través de difusión UDP o similares] ] - etc, etc.), pero esa es la idea general.

0

Parece que el comportamiento es completamente diferente porque aquí su "daemon.py" se inicia en segundo plano como daemon.

En el otro enlace que señaló que el proceso que se encuestó es no un daemon, no se inicia en segundo plano. El iniciador simplemente espera para siempre que el proceso secundario se detenga.

Hay varias formas de solucionar esto. El clásico es la forma en que @Alex explica, usando algún archivo pid en lugares convencionales.

Otra forma podría ser la construcción de la vigilancia dentro de su demonio que se ejecuta en demonio y el perro guardián ... esto podría simular un proceso correcto que no se rompen al azar (algo que no debería ocurrir) ...

3

Debería ver la Propuesta de mejora de Python 3143 (PEP) here. En él, Ben sugiere incluir una biblioteca daemon en el lib lib de python. Él revisa MUCHA información muy buena sobre daemons y es una lectura bastante fácil. La implementación de referencia es here.

+0

Gracias por la referencia de Pablo. Parece útil. – chris

-1

Haz uso de 'https://github.com/ut0mt8/simple-ha'.

sencilla-ha

Cansado de keepalived, corosync, marcapasos, latido del corazón o lo que sea? Aquí un daemon simple que asegura un Heartbeat entre dos hosts.Uno está activo y el otro es copia de seguridad, iniciando el script cuando cambia el estado. Implementación simple, KISS. Producción lista (al menos funciona para mí :)

¡La vida será demasiado fácil!

+1

Si bien esto puede teóricamente responder a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) para incluir las partes esenciales de la respuesta aquí, y proporcionar el enlace de referencia. –

+0

Gracias por señalar. Trataré de actualizar esto lo antes posible. –

Cuestiones relacionadas