Cómo monitorear un servicio y reiniciar si se detiene en Linux

24

En realidad, no estoy tan seguro de si debería usar Shell Scripts, o si ya hay algunas formas. Pero sea cual sea el enfoque que usemos, me gustaría mantener un Servicio en funcionamiento todo el tiempo.

Digamos iptablescomo un ejemplo. Luego ..

  • Cada vez que el iptablesservicio está stoppedo (en otras palabras) no se está ejecutando, quiero que esté started(o restarted) ... automáticamente cada vez que se detenga (o no se esté ejecutando).
  • En otras palabras más simples, quiero mantener un Servicio en funcionamiento todo el tiempo.

( Tal vez podría dar una frecuencia regular para verificar, si hacer la verificación en tiempo real es el problema. Así que digamos, cada 5 minutos)

La única forma en que se me ocurre es usar Shell Scripts con Cron Tab.

  • ¿Hay alguna solución inteligente por favor?

¡Gracias!

夏 期 劇場
fuente
No deberías hacer eso. Supongamos que un servicio está mal configurado, ¿qué lograría su estrategia? Una lista infinita de juicios. En su lugar, debe escribir un script crontab que alertsle indique que algo no funciona.
MariusMatutiae
Tengo curiosidad acerca de la solución directa, para la pregunta original. Y también, tengo un Servicio que simplemente debe ser simplemente restartedcuando se detuvo, por cualquier motivo. No hay problema con reiniciar.
夏 期 劇場
1
Su propia solución sugerida es lo suficientemente inteligente. Si lo usa correctamente (salga inmediatamente si el servicio ya se está ejecutando, advierta que el servicio se ha detenido para que pueda solucionarlo, etc.) es la forma más sencilla. Un servicio que se detiene automáticamente es un servicio problemático, por lo que eventualmente debería solucionarlo, pero de lo contrario, como un parche temporal, un script cron u otro demonio súper simple que duerme la mayor parte del tiempo, funcionará bien. Hay algunas herramientas como mmonit.com/monit pero creo que al final todas usan un enfoque similar
@MariusMatutiae, estoy de acuerdo con su punto, pero depende de la naturaleza del servicio, y la mayoría de los gerentes de procesos retrocederán después de varios reinicios fallidos. Es perfectamente razonable que un proceso finalice naturalmente y que queramos reiniciarlo automáticamente, por ejemplo, un trabajador que recoge un trabajo de una cola y termina después de cada ejecución. También es una herramienta útil para los administradores de sistemas que sufren un código de pérdida de memoria a medida: limite la vida útil de un proceso y reinícielo automáticamente antes de que pueda salirse de control ...
Alex Forbes

Respuestas:

25

Actualización marzo 2018

Esta respuesta ahora es bastante antigua, y desde que fue escrita systemd ha ganado la guerra pid1 en Linux. Por lo tanto, probablemente debería crear una unidad systemd , si systemd está integrado en su distribución (que es la mayoría de ellos).

La respuesta a continuación se conserva para la posteridad.


La respuesta anterior es válida, pero pensé en mencionar algunas alternativas:

Vale la pena tener en cuenta que su sistema operativo ya ha resuelto el problema de gestión de procesos. Tradicionalmente, Linux ha usado sysvinit, que es básicamente la colección de scripts que ves en init.d. Sin embargo, es bastante tonto y no puede monitorear los procesos, los scripts init.d son complicados y están siendo reemplazados por una buena razón.

Los sistemas operativos más modernos están comenzando a reemplazar a sysvinit, y los pioneros son Upstart y Systemd. Debian se está inclinando hacia systemd, Ubuntu se ha desarrollado y prácticamente ya ha hecho la transición a Upstart, y al igual que Debian Redhat / CentOS / Fedora se está moviendo hacia systemd. Por lo tanto, si usa un sistema operativo que ya ha reemplazado a sysvinit, recomendaría usar lo que está incorporado. Los guiones son mucho más fáciles de escribir que los guiones de inicio.

He usado runit y me gusta bastante, pero el más fácil de usar es el supervisor. También está muy bien documentado, funciona en casi cualquier lugar y está empaquetado en todas las distribuciones principales.

Pero hagas lo que hagas, por favor, por favor, NO utilices un script de shell. ¡Hay tantas cosas mal con ese enfoque!

Alex Forbes
fuente
¿Cómo hacerlo con sysvinit?
horseyguy
12

iptableses un mal ejemplo, ya que no se está ejecutando realmente un servicio o demonio, sino parte del núcleo. Realmente no puede "parar" iptables, solo puede darle una configuración y "parar" implica darle una configuración en blanco. De hecho, he tenido fallas en los sistemas Linux, pero la configuración de reenvío de puertos iptablessigue funcionando.

De todos modos, una utilidad llamada monithará lo que quieras. Si está utilizando Debian, está apt-get install monitlejos. Es un poco complicado de aprender pero muy flexible.

LawrenceC
fuente
3

Estamos utilizando este script simple para hacer una alerta e iniciar el servicio si no se está ejecutando. También puede agregar más servicios.

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null
Ranjithkumar T
fuente
El punto de MariusMatutiae es correcto, pero hemos hecho un script simple para monitorear el servicio HTTPD y DNS en mi servidor, está funcionando bien. Cuando el servicio esté inactivo, el script lo reiniciará y nos enviará una alerta. Si recibimos muchas alertas / correos electrónicos con respecto al servicio inactivo, podemos investigarlo.
Ranjithkumar T
0

Sé que han pasado varios años desde que se hizo la pregunta. pero con systemd (principalmente disponible con centos y REHL) puede ejecutar este comando bash con cron para verificar y reiniciar si el servicio está inactivo.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

guárdelo en su directorio bin y asígnele el nombre de monitor. Déle el permiso de archivo apropiado. luego ejecútalo como

sudo monitor redis

si desea verificar el servicio de redis y reiniciar / iniciar si es necesario.

Por último, agregue esto a su trabajo cron.

espero que esto ayude

Ahmad Sajid
fuente
0

Para agregar a la larga lista de supervisión init / svc, como un subdirectorio para S6 hay un nuevo chico en el bloque, 66, que maneja la administración y el registro del servicio s6 de una manera rápida, ligera y fácil de usar. Este es el enlace a la documentación oficial de Obarun-Linux https://web.obarun.org/software

Esta es una pregunta frecuente sobre cómo usar este software 66 y dar sentido a s6 http://sysdfree.wordpress.com/266

Desde su lanzamiento estable, solo se encontró un error relacionado con los cambios del kernel desde 4.20 -> 5.0, todos los demás problemas informados tenían que ver con que las personas aprendieran algo nuevo. Si la gestión del servicio tuviera que ser más simple que esto, sería mejor cambiar a ms-windows (Linus no lo permita). Para ver en la vida real cómo puede funcionar esto, solo hay que descargar un Obarun live.iso y jugar con él. Instale los servicios y sus scripts de 66 habilítelos, elimínelos, vea sus registros, deténgalos e inícielos (mientras esté habilitado), agrupe los servicios en un árbol y haga que los árboles de servicio se inicien y detengan todos juntos, tenga servicios de nivel de usuario por separado del sistema Hace lo que s6 hace bien y hace que sea más simple para el usuario explotar el sistema a prueba de balas bajo s6.

Las descargas de imágenes se pueden encontrar aquí: https://web.obarun.org/index.php?id=74 md5 verifique los archivos https://repo.obarun.org/iso/

Además de init y service management s6 / 66 no tiene dependencias de ninguna otra cosa en el sistema. Es una capa del sistema base que deja que el resto del software funcione solo, init / svc-mgmt a ciegas. Todos los s6 y 66 están escritos en C y no son específicos de Linux, ni específicos de Glibc. Los servidores de Skarnet (autores de s6) han estado funcionando durante casi una década sin muchas pausas en el sistema de musl personalizado. Alpine, Void y Adelie actualmente también tienen software s6 en sus repositorios, Adelie lo usa por defecto para la supervisión del servicio. El vacío ahora lleva 66 también. No sé si y hasta qué punto alguien ha portado s6 a xxBSD u otros sistemas xxIX.

Gus Fun
fuente