Einige Linux-Dienste sollen nach der Initialisierung beendet werden — und das verwirrt Service-Monitore. Wenn Sie einen mit einem Service-Monitor in Level überwachen, erhalten Sie Fehlalarme. Die Lösung ist ein Script-Monitor, der SubState statt ActiveState liest.
Warum Service-Monitore Fehlalarme auslösen
systemd verfolgt jede Unit über zwei Statusfelder: ActiveState und SubState. Service-Monitore prüfen ActiveState — Werte wie active, inactive oder failed.
Das Problem: Bestimmte Dienste beenden sich nach ihrer Arbeit und treten nie in einen persistenten active-Zustand ein. WireGuard's wg-quick ist das häufigste Beispiel. Es konfiguriert die VPN-Schnittstelle und beendet sich dann. systemd notiert ActiveState als inactive (exited). Ein Service-Monitor sieht inactive und löst einen Alarm aus — obwohl das VPN ordnungsgemäß funktioniert, die Schnittstelle aktiv ist und der Datenverkehr weitergeleitet wird.
SubState erzählt eine genauere Geschichte. Für Dienste wie wg-quick ist ein fehlerfreier SubState exited — erwartet und normal. Ein SubState von failed würde bedeuten, dass etwas wirklich schiefgelaufen ist. Das direkte Überprüfen von SubState ermöglicht es Ihnen, den Unterschied zu erkennen.
SubState mit einem Script überprüfen
Verwenden Sie systemctl show, um SubState für eine beliebige Unit zu lesen:
systemctl show -p SubState --value <unit_name>
Dies gibt einen einzelnen String zurück — running, exited, dead, failed usw. — den Sie in einem Script-Monitor auswerten können.
🖥️ PLATTFORMNOTIZ:
Linux: Unterstützt auf jeder Distribution mit systemd.
Windows / macOS: Nicht zutreffend.
systemctlist nur unter Linux verfügbar.
Beispiel: Überwachung einer WireGuard-Schnittstelle
Das folgende Script prüft, ob wg-quick@wg0 sich im erwarteten exited SubState-Zustand befindet. Ersetzen Sie den Unit-Namen, wenn Ihrer anders ist.
#!/bin/bash
UNIT_NAME="wg-quick@wg0"
STATUS=$(systemctl show -p SubState --value $UNIT_NAME)
if [ "$STATUS" = "exited" ]; then
echo "Service is running correctly."
exit 0
else
echo "ALERT: Service is not running. SubState: $STATUS"
exit 1
fi
Das Script gibt eine lesbare Statuszeichenkette aus und beendet sich mit Code 0 (fehlerfrei) oder 1 (unerwarteter Zustand). Konfigurieren Sie den Script-Monitor so, dass er ausgelöst wird, wenn die Ausgabe Enthält die Fehlerzeichenkette „ALERT".
Monitor-Konfiguration:
Feld | Wert |
Typ | Script ausführen |
BS | Linux |
Script | Linux - WireGuard SubState Check |
Script-Ausgabe | Enthält |
Wert |
|
Ausführungshäufigkeit | 5 Minuten |
Auslösungsanzahl | 2 |
💡 TIPP: Stellen Sie die Auslösungsanzahl auf 2 oder höher ein, um Warnungen aus vorübergehenden Zuständen während Dienst-Neustarts oder Neuboots zu vermeiden.
Andere Unit-Typen, die planmäßig beendet werden
wg-quick ist der häufigste Fall, aber jeder dieser Fälle kann das gleiche Falschalarm-Muster auslösen:
Oneshot-Services — führen eine Aufgabe aus und beenden sich;
SubStateistexited, wenn fehlerfreiTimer-Units — werden nach einem Zeitplan ausgeführt; prüfen Sie
ActiveStatefür die Timer-Unit selbst, nicht für den Service, den sie startetType=forking-Services — übergeordneter Prozess beendet sich nach dem Erzeugen eines untergeordneten Prozesses; SubState kann
exitedsein, während das untergeordnete Prozesspaket läuft
Für alle diese Fälle ist ein Script-Monitor, der SubState gegen Ihren bekannten Wert überprüft, der richtige Ansatz.
Häufig gestellte Fragen
Mein WireGuard-Dienst wird in Level als Ausgefallen angezeigt, aber der Datenverkehr wird richtig weitergeleitet. Was ist los?
wg-quickbeendet sich nach der Konfiguration der VPN-Schnittstelle — das ist normal. Die Netzwerkschnittstelle bleibt aktiv, auch wenn der Dienst-Prozess beendet wurde. Ein Service-Monitor siehtinactiveund löst einen Alarm aus. Verwenden Sie stattdessen einen Script-Monitor, derSubStateüberprüft (wasexitedzurückgibt, den fehlerfreien Wert).Woher weiß ich, welchen SubState-Wert ich erwarten sollte, wenn ein Dienst fehlerfrei ist? Führen Sie
systemctl show -p SubState --value <unit_name>auf einem Gerät aus, auf dem der Dienst ordnungsgemäß läuft. Was auch immer es zurückgibt, ist Ihre fehlerfreie Grundlage. Schreiben Sie das Script gegen diesen Wert.Kann ich sowohl ActiveState als auch SubState im gleichen Monitor überprüfen? Ja. Schreiben Sie das Script, um beide zu lesen und zu fehlschlagen, wenn eines davon unerwartet ist. Dies gibt Ihnen umfassendere Abdeckung — Sie können Dienste erkennen, die unerwartet beendet wurden (
SubState: failed), getrennt von Diensten, die einfach gestoppt wurden (ActiveState: inactive).Funktioniert dies auf Linux-Distributionen, die systemd nicht verwenden? Nein.
systemctlerfordert systemd. Auf Distributionen mit SysVinit oder Upstart benötigen Sie unterschiedliche Tools (z. B.service <name> status). Die meisten aktiv gepflegten Linux-Distributionen verfügen über systemd.
