Asegúrese de que un proceso siempre se esté ejecutando

23

Empecé a alojar sitios hace un tiempo usando Cherokee. Para fuentes externas (FastCGI, etc.) tiene una opción para iniciar el proceso si no puede encontrar uno ejecutándose en el socket o puerto designado. Esto es genial porque significa que si PHP o un sitio de Django se cae (como lo hacen ocasionalmente), se reinicia automáticamente.

En un nuevo servidor que usa PHP-FPM no pude usar Cherokee (tiene un error con PHP), así que me mudé a NGINX. Realmente me gusta NGINX (por su estilo de configuración) pero estoy teniendo serios problemas con los procesos que se caen y nunca reaparecen. PHP hace esto a veces, pero los sitios de Django son más problemáticos. He creado scripts de inicio para ellos y aparecen en el arranque, pero esto no me ayuda si se desconectan entre reinicios.

Supongo que estoy buscando un proxy FastCGI. Algo que, como Cherokee, sabe qué procesos deberían ejecutarse en qué sockets / puertos y los reaparece a pedido. ¿Existe tal cosa? ¿Hay alguna forma de construir esto en NGINX (para facilitar la configuración)?

Oli
fuente

Respuestas:

13

¿Qué tal daemontools y específicamente la herramienta de supervisión?

supervisar supervisa un servicio. Inicia el servicio y lo reinicia si muere. Configurar un nuevo servicio es fácil: todas las necesidades de supervisión son un directorio con un script de ejecución que ejecuta el servicio.

Murilo
fuente
+1 para daemontools. Sin embargo, a menudo no puedes simplemente lanzar un script como /etc/init.d/apachectlél. A menudo necesita reescribir su propio script de inicio simple para usar exec. Aunque me encantaría ver algunos ejemplos más usando Daemontools
Stefan Lasiewski
daemontools tiene otra encarnación como runit. No es tan importante ahora que daemontools es de dominio público, pero una distribución anterior solo puede tener runit.
camh
5

Respaldo la daemontoolssugerencia, pero si no te gusta la forma en que funciona el software de DJB (por cualquier razón), también la hay supervisord.

Configuré una imagen de FreeBSD hace un tiempo que solía supervisordadministrar nginxy gunicorn, que solía alojar algunas aplicaciones WSGI simples, y todo el proceso fue bastante sencillo.

Si está haciendo esto para Django, Gunicorn hace que sea realmente sencillo implementar aplicaciones Django, por cierto. Vea esta publicación de blog para más detalles.

Hank Gay
fuente
4

Otra opción podría ser usar monit , que es el que generalmente uso.


fuente
3

¿Lo has considerado god?

God es un marco de monitoreo fácil de configurar y de extender escrito en Ruby.

Mantener los procesos y tareas del servidor en ejecución debería ser una parte simple de su proceso de implementación. Dios pretende ser la aplicación de monitoreo más simple y poderosa disponible.

Lo uso para asegurarme de que si las instancias de Rails / nginx se caen, se reviven, y aunque no veo soporte integrado para verificar si está usando el puerto correcto o no, pero si el problema es que el proceso falla o ya no se está ejecutando, no te puedes equivocar god.

Chris Bunch
fuente
0

Una solución pirata sería lanzar periódicamente un script (vía cron) que detecte si el proceso está inactivo y, en este caso, reiniciarlo.

Robert Swisher
fuente
0

Hay varias formas de reiniciar un demonio fallido, la recomendación habitual es "reaparecer en inittab", pero con cierta consideración de un límite si la máquina está realmente atornillada.

El daemon watchdog también puede monitorear un proceso a través de su archivo PID. Sin embargo, eso solo debe considerarse como una línea secundaria de defensa para reiniciar una máquina que está demasiado enferma para funcionar correctamente (por ejemplo, sin memoria, bombardeada, etc.), y no como una forma primaria o para monitorear y reiniciar un demonio.

Finalmente, puede considerar monitorear sistemas complejos usando nagios para proporcionar a los administradores una vista global. Puede ejecutar complementos para sondear el funcionamiento del daemon externamente, que es una prueba más completa de su funcionamiento que simplemente el PID en vivo.

Paul Crawford
fuente
-1

Respuesta simple: comience, escriba su pid en algún lugar y cada x veces (segundos, minutos, su apuesta) verifique si el proceso ha finalizado.

Respuesta larga: todo lo anterior son buenos métodos. Pero algo complicado.

También tenga en cuenta que estar vivo y responder a las solicitudes son cosas diferentes.

lucabotti
fuente
1
... y cruza los dedos y espera que nada garabatee sobre el archivo PID, o lo borre, o lo reutilice para un demonio diferente, o lo vuelva a señalar en algún otro proceso inocente y no relacionado que no reaccionará bien al cheque por estar despierto ☺ Es por eso que la respuesta larga de un supervisor de demonio adecuado que ejecuta demonios como procesos secundarios y los monitorea con los mecanismos habituales del sistema Unix / Linux es la mejor manera aceptada desde hace mucho tiempo.
JdeBP