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.