Introduction
Einige Linux-Dienste sind so konzipiert, dass sie sich nach der Initialisierung beenden — und das löst Service-Monitore aus. Wenn Sie einen mit einem Service-Monitor in Level überwachen, erhalten Sie falsche Warnungen. Die Lösung ist ein Script-Monitor, derSubState instead of ActiveState.
Warum Service-Monitore falsche Warnungen auslösen
systemd verfolgt jede Unit über zwei Statusfelder: ActiveState and SubState. Service-Monitore prüfen ActiveState — values like active, inactive , or failed.
The problem: Bestimmte Dienste beenden sich nach ihrer Arbeit und geben nie einen persistenten active Status an. WireGuard wg-quickist das häufigste Beispiel. Es konfiguriert die VPN-Schnittstelle und beendet sich dann. systemd protokolliert ActiveState as inactive (exited) . Ein Service-Monitor sieht inactive und löst eine Warnung aus — obwohl das VPN korrekt funktioniert, die Schnittstelle aktiv ist und der Verkehr routet.
SubState erzählt eine präzisere Geschichte. Für Dienste wie wg-quick ist ein gesunder SubState exited — erwartet und normal. Ein SubState vonfailedwürde bedeuten, dass tatsächlich etwas schief gelaufen ist. ÜberprüfungSubStatedirekt ermöglicht es Ihnen, den Unterschied zu erkennen.
SubState mit einem Script überprüfen
Use systemctl showUm den 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, etc. — den Sie in einem Script-Monitor auswerten können.
🖥️ PLATFORM NOTE:
Linux: Unterstützt auf jeder Distribution, die systemd verwendet.
Windows / macOS: Not applicable.
systemctlis Linux-only.
Beispiel: Überwachung einer WireGuard-Schnittstelle
Das folgende Script überprüft, obwg-quick@wg0 sich im erwarteten exitedSubState befindet. Ersetzen Sie den tatsächlichen Unit-Namen, wenn 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 Script gibt einen lesbaren Statusstring aus und beendet sich mit Code 0 (gesund) oder 1 (unerwarteter Status). Konfigurieren Sie den Script-Monitor so, dass er auslöst, wenn die Ausgabe Contains die Fehlerzeichenfolge "ALERT" enthält.
Monitor-Konfiguration:
Field | Value |
Typ | Run script |
OS | Linux |
Script | Linux - WireGuard SubState Überprüfung |
Script output | Contains |
Value |
|
Run frequency | 5 minutes |
Trigger count | 2 |
💡 TIP: Set Trigger count auf 2 oder höher, um Warnungen von transienten Zuständen während Service-Neustarts oder Reboots zu vermeiden.
Andere Unit-Typen, die sich absichtlich beenden
wg-quick ist der häufigste Fall, aber jeder dieser Typen kann dasselbe Falschwarnungsmuster auslösen:
Oneshot-Dienste — führen eine Aufgabe aus und beenden sich;
SubStatewill beexitedwhen healthyTimer units— läuft nach Zeitplan; überprüfen Sie
ActiveStatefür die Timer-Unit selbst, nicht den Dienst, den sie startetType=forking-Dienste— Der übergeordnete Prozess beendet sich nach dem Spawnen eines untergeordneten; SubState kann
exitedsein, während das untergeordnete Element läuft
Für alle diese Fälle ist ein Script-Monitor, derSubStategegen Ihren bekannten guten Wert prüft, der richtige Ansatz.
FAQ
Mein WireGuard-Dienst wird in Level als Down angezeigt, aber der Verkehr routet einwandfrei. Was passiert?
wg-quickbeendet sich nach der Einrichtung der VPN-Schnittstelle — das ist normal. Die Netzwerkschnittstelle bleibt aktiv, obwohl der Serviceprozess beendet wurde. Ein Service-Monitor siehtinactiveund löst eine Warnung aus. Verwenden Sie stattdessen einen Script-Monitor, derSubState(which returnsexited, den gesunden Wert) überprüft.Wie kann ich wissen, welchen SubState-Wert ich erwarten kann, wenn ein Dienst gesund ist? Run
systemctl show -p SubState --value <unit_name>auf einem Gerät, auf dem der Dienst ordnungsgemäß funktioniert. Was auch immer zurückkommt, ist Ihre gesunde Baseline. Script gegen diesen Wert.Kann ich ActiveState und SubState im selben Monitor überprüfen?Ja. Schreiben Sie das Script so, dass es beide liest und fehlschlägt, wenn eines unerwartet ist. Dies gibt Ihnen eine umfassendere Abdeckung — Sie können Dienste, die unerwartet beendet wurden, separat erkennen (
SubState: failed) von Diensten, die einfach gestoppt sind (ActiveState: inactive).Funktioniert dies auf Linux-Distributionen, die systemd nicht verwenden? No.
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.
