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.

Nombre para mostrar
fuente
¿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 [email protected]servicio 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

Pablo Martinez
fuente
55
Hay un par de correcciones necesarias para las instrucciones en el sitio vinculado. Primero, notify%n.servicees redundante y dará como resultado [email protected]. 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/[email protected]

[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" [email protected]'

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
ceinmart
fuente
¿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