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.


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


5
Es sind einige Korrekturen an den Anweisungen auf der verlinkten Site erforderlich. Erstens notify%n.serviceist redundant und führt zu notify@my-service.service.service. 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/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'

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.