Zum Hauptinhalt springen

Überwachung von systemd-Unit-Dateien unter Linux

Why Linux systemd unit files trigger false 'Down' alerts in service monitors and how to monitor them accurately using a script monitor.

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.

Wiregard Example

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. systemctl ist 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

ALERT

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; SubState wird sein exited wenn gesund

  • Timer-Units — werden nach einem Zeitplan ausgeführt; prüfen Sie ActiveState für die Timer-Unit selbst, nicht für den Dienst, den sie startet

  • Type=forking-Dienste — übergeordneter Prozess beendet sich nach dem Starten eines Child-Prozesses; SubState kann sein exited wä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-quick beendet sich nach dem Einrichten des VPN-Interfaces – das ist normal. Das Netzwerk-Interface bleibt aktiv, obwohl der Dienstprozess beendet wurde. Ein Service-Monitor sieht inactive und löst einen Alarm aus. Verwenden Sie einen Skript-Monitor, der SubState (das exited, 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. systemctl erfordert 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.

Hat dies deine Frage beantwortet?