Benachrichtigung erhalten, wenn der vom System überwachte Dienst in den Status "Fehlgeschlagen" wechselt

32

Ich benötige Netzwerknachrichten, die gesendet werden, wenn ein Systemdienst abstürzt oder hängt (dh in den Status "Fehlgeschlagen" wechselt; ich überprüfe den Zustand mithilfe von WatchdogSec =). Ich bemerkte, dass neuere Systeme FailureAction = haben, sah dann aber, dass dies keine willkürlichen Befehle zulässt, sondern nur einen Neustart / Herunterfahren.

Insbesondere brauche ich eine Möglichkeit, eine Netzwerknachricht zu senden, wenn systemd feststellt, dass das Programm abgestürzt ist, und eine andere, wenn es feststellt, dass es hängt.

Ich hoffe auf eine bessere Antwort als "die Protokolle analysieren" und ich brauche etwas, das eine fast sofortige Antwortzeit hat, daher halte ich einen Polling-Ansatz nicht für gut. es sollte etwas sein, das durch das eintretende Ereignis ausgelöst wird.

Anzeigename
quelle
Können Sie bitte ein (auch nicht funktionierendes) Beispiel dafür geben, was Sie erreichen möchten?
Dawud
Können Sie bitte Ihre Frage bearbeiten, um diese Informationen hinzuzufügen, anstatt sie in einem Kommentar hinzuzufügen? :)
dawud

Antworten:

31

System-Einheiten unterstützen OnFailure, das eine Einheit (oder mehr) aktiviert, wenn die Einheit ausfällt. Sie können so etwas wie setzen

 OnFailure=notify-failed@%n

Erstellen [email protected]Sie dann den Dienst, in dem Sie den erforderlichen Bezeichner verwenden können (wahrscheinlich möchten Sie mindestens% i), um das Skript oder den Befehl zu starten, der die Benachrichtigung sendet.

Ein praktisches Beispiel finden Sie unter http://northernlightlabs.se/systemd.status.mail.on.unit.failure

Pablo Martinez
quelle
5
Es sind einige Korrekturen an den Anweisungen auf der verlinkten Site erforderlich. Erstens notify%n.serviceist redundant und führt zu [email protected]. Zweitens %isollte anstelle von verwendet werden %I, oder alle Bindestriche im Namen werden in Schrägstriche umgewandelt.
Orodbhen
4
Gibt es eine Möglichkeit, dies für mehrere oder alle Einheiten zu tun, ohne deren Einheitendateien zu ändern?
Vladimir Panteleev
16

Nur meine Art zu benachrichtigen:

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

zu systemd hinzufügen:

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

Bei anderen Dienstleistungen fügen Sie hinzu:

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

Laden Sie die Konfiguration neu:

systemctl daemon-reload
ceinmart
quelle
Gibt es eine Möglichkeit, zu vermeiden, dass es oft hintereinander ausgelöst wird? In einigen Situationen ist es nicht hilfreich, 1K-E-Mails über einen Dienst zu erhalten, der nachts fehlgeschlagen ist und immer wieder versucht hat, sich selbst neu zu starten.
Starbeamrainbowlabs