Einführung
Einige Linux-Dienste sind so konzipiert, dass sie nach der Initialisierung beendet werden – das bringt Dienstüberwachungen durcheinander. Wenn Sie einen solchen Dienst mit einem Service-Monitor in Level beobachten, erhalten Sie Fehlalarme. Die Lösung ist ein Skript-Monitor, der SubState anstatt ActiveState.
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 wechseln nie in einen dauerhaften active Zustand. WireGuards wg-quick ist das häufigste Beispiel. Es konfiguriert das VPN-Interface und beendet sich dann. systemd zeichnet ActiveState als inactive (exited). Ein Service-Monitor sieht inactive und löst einen Alarm aus – obwohl das VPN korrekt läuft, das Interface aktiv ist und der Datenverkehr weitergeleitet wird.
SubState erzählt eine genauere Geschichte. Für Dienste wie wg-quick, ist ein gesunder SubState exited — erwartet und normal. Ein SubState von failed würde bedeuten, dass tatsächlich etwas schiefgelaufen ist. Das Prüfen von SubState direkt auszulesen ermöglicht es Ihnen, den Unterschied zu erkennen.
SubState mit einem Skript prüfen
Verwenden Sie systemctl show um den SubState für eine beliebige Unit auszulesen:
systemctl show -p SubState --value <unit_name>
Dies gibt eine einzelne Zeichenkette zurück — running, exited, dead, failed, usw. — die Sie in einem Skript-Monitor auswerten können.
🖥️ PLATTFORMHINWEIS:
Linux: Unterstützt auf jeder Distribution, die systemd verwendet.
Windows / macOS: Nicht anwendbar.
systemctlist nur unter Linux verfügbar.
Beispiel: Überwachung eines WireGuard-Interfaces
Das folgende Skript prüft, ob wg-quick@wg0 den erwarteten exited SubState. Ersetzen Sie den Unit-Namen durch Ihren tatsächlichen Namen, falls er abweicht.
#!/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 Skript gibt eine lesbare Statuszeichenkette aus und beendet sich mit Code 0 (gesund) oder 1 (unerwarteter Zustand). Konfigurieren Sie den Skript-Monitor so, dass er ausgelöst wird, wenn die Ausgabe Enthält die Fehlerzeichenkette „ALERT".
Monitor-Konfiguration:
Feld | Wert |
Typ | Skript ausführen |
Betriebssystem | Linux |
Skript | Linux - WireGuard SubState-Prüfung |
Skriptausgabe | Enthält |
Wert |
|
Ausführungshäufigkeit | 5 Minuten |
Auslöseanzahl | 2 |
💡 TIPP: Setzen Sie Auslöseanzahl auf 2 oder höher setzen, um Alarme durch vorübergehende Zustände während Dienstneustarts oder Reboots zu vermeiden.
Weitere Unit-Typen, die planmäßig beendet werden
wg-quick ist der häufigste Fall, aber alle diese können dasselbe Fehlalarmmuster auslösen:
Oneshot-Dienste — führen eine Aufgabe aus und beenden sich;
SubStatewird seinexitedwenn gesundTimer-Units — werden nach einem Zeitplan ausgeführt; prüfen Sie
ActiveStatefür die Timer-Unit selbst, nicht für den Dienst, den sie startetType=forking-Dienste — übergeordneter Prozess beendet sich nach dem Starten eines Child-Prozesses; SubState kann sein
exitedwährend der Child-Prozess läuft
Für all diese Fälle ist ein Skript-Monitor, der SubState mit Ihrem bekannten Gut-Wert ist der richtige Ansatz.
FAQ
Mein WireGuard-Dienst wird in Level als ausgefallen angezeigt, aber der Datenverkehr wird korrekt weitergeleitet. Was passiert hier?
wg-quickbeendet sich nach dem Einrichten des VPN-Interfaces – das ist normal. Das Netzwerk-Interface bleibt aktiv, obwohl der Dienstprozess beendet wurde. Ein Service-Monitor siehtinactiveund löst einen Alarm aus. Verwenden Sie einen Skript-Monitor, derSubState(dasexited, den gesunden Wert) zurückgibt.Woher weiß ich, welchen SubState-Wert ich erwarten kann, wenn ein Dienst gesund ist? Führen Sie
systemctl show -p SubState --value <unit_name>auf einem Gerät, auf dem der Dienst korrekt funktioniert. Was auch immer zurückgegeben wird, ist Ihr gesunder Ausgangswert. Schreiben Sie das Skript gegen diesen Wert.Kann ich sowohl ActiveState als auch SubState im selben Monitor prüfen? Ja. Schreiben Sie das Skript so, dass es beide ausliest und fehlschlägt, wenn einer von beiden unerwartet ist. Dies gibt Ihnen eine breitere Abdeckung – Sie können Dienste erkennen, die unerwartet beendet wurden (
SubState: failed) getrennt von Diensten, die einfach gestoppt sind (ActiveState: inactive).Funktioniert dies auf Linux-Distributionen, die kein systemd verwenden? Nein.
systemctlerfordert systemd. Auf Distributionen, die SysVinit oder Upstart verwenden, benötigen Sie andere Tools (z. B.service <name> status). Die meisten aktiv gepflegten Linux-Distributionen werden mit systemd ausgeliefert.
