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.


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 notify-failed@.serviceservice 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


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 notify@my-service.service.service. 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/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'

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.