Zum Hauptinhalt springen

Überwachung von systemd-Unit-Dateien unter Linux

Warum Linux-Systemd-Unit-Dateien falsche Warnungen auslösen.

Heute aktualisiert

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.

Wireguard-Beispiel

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

ALERT

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; SubState ist exited, wenn fehlerfrei

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

  • Type=forking-Services — übergeordneter Prozess beendet sich nach dem Erzeugen eines untergeordneten Prozesses; SubState kann exited sein, 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-quick beendet sich nach der Konfiguration der VPN-Schnittstelle — das ist normal. Die Netzwerkschnittstelle bleibt aktiv, auch wenn der Dienst-Prozess beendet wurde. Ein Service-Monitor sieht inactive und löst einen Alarm aus. Verwenden Sie stattdessen einen Script-Monitor, der SubState überprüft (was exited zurü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. systemctl erfordert 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.

Hat dies deine Frage beantwortet?