Zum Hauptinhalt springen

Überwachung von systemd-Unit-Dateien unter Linux

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

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.

Wiregard Example

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

ALERT

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;SubState will be exited when healthy

  • Timer units— läuft nach Zeitplan; überprüfen SieActiveState für die Timer-Unit selbst, nicht den Dienst, den sie startet

  • Type=forking-Dienste— Der übergeordnete Prozess beendet sich nach dem Spawnen eines untergeordneten; SubState kann exited sein, 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-quick beendet sich nach der Einrichtung der VPN-Schnittstelle — das ist normal. Die Netzwerkschnittstelle bleibt aktiv, obwohl der Serviceprozess beendet wurde. Ein Service-Monitor sieht inactiveund löst eine Warnung aus. Verwenden Sie stattdessen einen Script-Monitor, derSubState (which returns exited , 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. 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?