obtenir une notification lorsque le service surveillé par systemd entre en état d'échec

32

J'ai besoin d'envoyer des messages réseau lorsqu'un service systemd tombe en panne ou est bloqué (c'est-à-dire qu'il entre en état d'échec; je surveille le blocage en utilisant WatchdogSec =). J'ai remarqué que les nouveaux systemd ont FailureAction =, mais j'ai vu que cela ne permettait pas les commandes arbitraires, mais simplement le redémarrage / l'arrêt.

Plus précisément, j'ai besoin d'un moyen pour envoyer un message réseau lorsque systemd détecte que le programme s'est écrasé, et un autre lorsqu'il détecte qu'il s'est bloqué.

J'espère une meilleure réponse que "analyser les journaux", et j'ai besoin de quelque chose qui a un temps de réponse presque instantané, donc je ne pense pas qu'une approche d'interrogation soit bonne; ce devrait être quelque chose déclenché par l'événement qui se produit.

Afficher un nom
la source
Pouvez-vous donner un exemple (même non fonctionnel) de ce que vous essayez de réaliser?
dawud
Pouvez-vous modifier votre question pour ajouter ces informations au lieu de les ajouter dans un commentaire? :)
dawud

Réponses:

31

Les unités systemd prennent en charge OnFailure qui active une unité (ou plus) lorsque l'unité tombe en panne. Vous pouvez mettre quelque chose comme

 OnFailure=notify-failed@%n

Et puis créez le [email protected]service où vous pouvez utiliser le spécificateur requis (vous voudrez probablement au moins% i) pour lancer le script ou la commande qui enverra une notification.

Vous pouvez voir un exemple pratique dans http://n Northernlightlabs.se/systemd.status.mail.on.unit.failure

Pablo Martinez
la source
5
Il y a quelques corrections nécessaires aux instructions sur le site lié. Tout d'abord, notify%n.serviceest redondant et se traduira par [email protected]. Deuxièmement, %idoit être utilisé à la place de %I, ou tous les tirets du nom seront convertis en barres obliques.
orodbhen
4
Existe-t-il un moyen de le faire pour plusieurs ou toutes les unités, sans modifier leurs fichiers d'unité?
Vladimir Panteleev
16

Juste ma façon d'avertir:

/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]'

ajouter à systemd:

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

À d'autres services, ajoutez:

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

Rechargez la configuration:

systemctl daemon-reload
ceinmart
la source
Existe-t-il un moyen d'éviter de le déclencher plusieurs fois de suite? Dans certaines situations, la réception d'e-mails 1K sur un service qui a échoué la nuit et a essayé à plusieurs reprises de se redémarrer n'est pas utile.
starbeamrainbowlabs