Evite los archivos PID, crons o cualquier otra cosa que intente evaluar procesos que no sean sus hijos.
Hay una muy buena razón por la cual en UNIX, SOLO puede esperar a sus hijos. Cualquier método (análisis ps, pgrep, almacenamiento de un PID, ...) que intente solucionarlo es defectuoso y tiene agujeros enormes. Solo di que no .
En su lugar, necesita que el proceso que supervisa su proceso sea el padre del proceso. ¿Qué significa esto? Significa que solo el proceso que inicia su proceso puede esperar confiablemente a que termine. En bash, esto es absolutamente trivial.
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
La parte anterior del código bash se ejecuta myserveren un untilbucle. La primera línea comienza myservery espera a que termine. Cuando termina, untilverifica su estado de salida. Si el estado de salida es 0, significa que terminó con gracia (lo que significa que le pidió que se cerrara de alguna manera, y lo hizo con éxito). En ese caso, no queremos reiniciarlo (¡solo le pedimos que se apague!). Si el estado de salida no es 0, untilejecutará el cuerpo del bucle, que emite un mensaje de error en STDERR y reinicia el bucle (de vuelta a la línea 1) después de 1 segundo .
¿Por qué esperamos un segundo? Porque si algo está mal con la secuencia de inicio myservery se bloquea de inmediato, tendrá un ciclo muy intenso de reinicio constante y bloqueo en sus manos. El sleep 1quita la tensión de eso.
Ahora todo lo que necesita hacer es iniciar este script bash (probablemente de forma asincrónica), y lo monitoreará myservery reiniciará según sea necesario. Si desea iniciar el monitor en el arranque (haciendo que el servidor "sobreviva" los reinicios), puede programarlo en el cron de su usuario (1) con una @rebootregla. Abra sus reglas cron con crontab:
crontab -e
Luego agregue una regla para iniciar su script de monitor:
@reboot /usr/local/bin/myservermonitor
Alternativamente; mira inittab (5) y / etc / inittab. Puede agregar una línea allí para myservercomenzar en un cierto nivel de inicio y reaparecer automáticamente.
Editar.
Permítanme agregar información sobre por qué no usar archivos PID. Si bien son muy populares; también son muy defectuosos y no hay razón para que no lo hagas de la manera correcta.
Considera esto:
Reciclaje de PID (matar el proceso incorrecto):
/etc/init.d/foo start: inicio foo, escriba fooel PID en/var/run/foo.pid
- Un rato después:
foomuere de alguna manera.
- Un tiempo después: cualquier proceso aleatorio que se inicie (llámelo
bar) toma un PID aleatorio, imagínelo tomando fooel PID anterior.
- Te das cuenta
foode que se ha ido: /etc/init.d/foo/restartlee /var/run/foo.pid, verifica si todavía está vivo, lo encuentra bar, piensa que lo foomata, comienza un nuevo foo.
Los archivos PID quedan obsoletos. Necesita una lógica demasiado complicada (o debería decir, no trivial) para verificar si el archivo PID está obsoleto y si dicha lógica es nuevamente vulnerable 1..
¿Qué sucede si ni siquiera tiene acceso de escritura o está en un entorno de solo lectura?
Es una sobrecomplicación sin sentido; vea cuán simple es mi ejemplo anterior. No hay necesidad de complicar eso, en absoluto.
Ver también: ¿Los archivos PID todavía tienen fallas cuando lo hacen 'bien'?
Por cierto; incluso peor que los archivos PID está analizando ps! Nunca hagas esto.
psEs muy inportable. Si bien lo encuentra en casi todos los sistemas UNIX; sus argumentos varían mucho si desea una salida no estándar. ¡Y la salida estándar es SOLO para consumo humano, no para análisis con secuencias de comandos!
- El análisis
psconduce a MUCHOS falsos positivos. ¡Tome el ps aux | grep PIDejemplo, y ahora imagine que alguien comienza un proceso con un número en algún lugar como argumento que resulta ser el mismo que el PID con el que miró a su demonio! Imagina a dos personas que comienzan una sesión X y estás buscando X para matar a la tuya. Es todo tipo de cosas malas.
Si no desea administrar el proceso usted mismo; Existen algunos sistemas perfectamente buenos que actuarán como monitor de sus procesos. Mira en runit , por ejemplo.