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 myserver
en un until
bucle. La primera línea comienza myserver
y espera a que termine. Cuando termina, until
verifica 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
, until
ejecutará 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 myserver
y se bloquea de inmediato, tendrá un ciclo muy intenso de reinicio constante y bloqueo en sus manos. El sleep 1
quita la tensión de eso.
Ahora todo lo que necesita hacer es iniciar este script bash (probablemente de forma asincrónica), y lo monitoreará myserver
y 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 @reboot
regla. 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 myserver
comenzar 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 foo
el PID en/var/run/foo.pid
- Un rato después:
foo
muere de alguna manera.
- Un tiempo después: cualquier proceso aleatorio que se inicie (llámelo
bar
) toma un PID aleatorio, imagínelo tomando foo
el PID anterior.
- Te das cuenta
foo
de que se ha ido: /etc/init.d/foo/restart
lee /var/run/foo.pid
, verifica si todavía está vivo, lo encuentra bar
, piensa que lo foo
mata, 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.
ps
Es 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
ps
conduce a MUCHOS falsos positivos. ¡Tome el ps aux | grep PID
ejemplo, 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.