obtener notificación cuando el servicio supervisado por systemd entre en estado fallido


32

Necesito que me envíen mensajes de red cuando un servicio systemd que tengo se cuelga o se cuelga (es decir, entra en estado fallido; superviso si se cuelga usando WatchdogSec =). Noté que los nuevos systemd tienen FailureAction =, pero luego vi que esto no permite comandos arbitrarios, sino solo reiniciar / apagar.

Específicamente, necesito una forma de enviar un mensaje de red cuando systemd detecta que el programa se ha bloqueado y otro cuando detecta que se ha bloqueado.

Espero una respuesta mejor que "analizar los registros", y necesito algo que tenga un tiempo de respuesta casi instantáneo, por lo que no creo que un enfoque de sondeo sea bueno; debería ser algo desencadenado por el evento que ocurre.


¿Puede proporcionar un ejemplo (incluso uno que no funcione) de lo que está tratando de lograr?
dawud

¿Puede editar su pregunta para agregar esta información en lugar de agregarla en un comentario? :)
dawud

Respuestas:


31

Las unidades systemd admiten OnFailure que activará una unidad (o más) cuando la unidad vaya a fallar. Puedes poner algo como

 OnFailure=notify-failed@%n

Y luego cree el notify-failed@.serviceservicio donde pueda usar el especificador requerido (probablemente desee al menos% i) para iniciar el script o comando que enviará una notificación.

Puede ver un ejemplo práctico en http://northernlightlabs.se/systemd.status.mail.on.unit.failure


55
Hay un par de correcciones necesarias para las instrucciones en el sitio vinculado. Primero, notify%n.servicees redundante y dará como resultado notify@my-service.service.service. Segundo, %idebe usarse en lugar de%I , o todos los guiones del nombre se convertirán en barras diagonales.
orodbhen

44
¿Hay alguna manera de hacer esto para múltiples o todas las unidades, sin modificar sus archivos de unidad?
Vladimir Panteleev

16

Solo mi forma de notificar:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

agregar a systemd:

systemctl enable /etc/systemd/system/notify-email@service

En otros servicios agregue:

[Unit]
OnFailure=notify-email@%i.service

Vuelva a cargar la configuración:

systemctl daemon-reload

¿Hay alguna manera de evitar dispararlo muchas veces seguidas? En algunas situaciones, recibir correos electrónicos de 1K sobre un servicio que falló por la noche e intentó una y otra vez reiniciarse no es útil.
starbeamrainbowlabs

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.