Linux Services mit systemctl für Prozessmanagement und Systemüberwachung (Bild © PCMasters.de)
Dienstzustände verstehen: „Enabled“ vs. „Running“
Ein entscheidender Unterschied in der Linux-Administration ist die Unterscheidung zwischen einem aktivierten und einem laufenden Dienst. Ein aktivierter Dienst ist so konfiguriert, dass er während des Systemstartvorgangs automatisch gestartet wird. Ein laufender Dienst hingegen ist derzeit im Systemspeicher aktiv und führt seine vorgesehenen Funktionen aus.
Es ist möglich, dass ein Dienst aktiviert ist, aber gerade nicht läuft. Dies tritt auf, wenn ein Dienst so eingestellt ist, dass er nur unter bestimmten Bedingungen ausgelöst wird, oder wenn er trotz seiner Startkonfiguration manuell gestoppt wurde.
So identifizierst du Dienste, die für den automatischen Start konfiguriert sind:
systemctl list-unit-files --type=service --state=enabled
So identifizierst du Dienste, die derzeit im Speicher aktiv sind:
systemctl list-units --type=service --state=running
Technische Umsetzung der Dienstauflistung
Mit dem Dienstprogramm „systemctl“ können Administratoren den Status von System-Units filtern, um bestimmte Betriebsdaten herauszufiltern. Eine Unit kann ein Dienst, ein Socket oder ein Gerät sein, und ihr Status wird danach kategorisiert, ob sie geladen, aktiv oder ausgefallen ist.
Umfassende Dienstliste
So zeigst du alle geladenen Dienste an, unabhängig von ihrem aktuellen Status (aktiv, ausgefallen oder beendet):
systemctl list-units --type=service
Filtern nach aktiven Diensten
Um Dienste herauszufiltern, die als aktiv gelten (dazu gehören auch solche, die eine Aufgabe erfolgreich abgeschlossen haben und beendet wurden):
systemctl list-units --type=service --state=active
Nur laufende Dienste identifizieren
Um eine Liste der Dienste zu erstellen, die derzeit im Hintergrund ausgeführt werden:
systemctl list-units --type=service --state=running
Zur Überprüfung einzelner Dienste liefert der Befehl „status“ detaillierte Telemetriedaten zu einem bestimmten Prozess:
systemctl status sshd
Optimierung durch Befehlsaliase
Aufgrund der Länge bestimmter „systemctl“-Zeichenfolgen richten Administratoren häufig Aliase in der Shell-Konfigurationsdatei (z. B. ~/.bashrc) ein, um die Arbeitseffizienz zu steigern. Durch Hinzufügen der folgenden Zeile zur Konfigurationsdatei:
alias running_services=‚systemctl list-units --type=service --state=running‘
Der Administrator kann den verkürzten Befehl running_services aufrufen, um die Liste der aktiven Prozesse abzurufen, ohne die vollständige Syntax eingeben zu müssen.
Netzwerkport- und Firewall-Analyse
Da viele Dienste als Netzwerk-Daemons fungieren, muss überprüft werden, welche TCP- oder UDP-Ports genutzt werden. Das Dienstprogramm „ss“ (oder das ältere Tool „netstat“) bietet diese Übersicht. Die Flags -l (listening), -t (TCP), -u (UDP), -n (numerisch) und -p (Prozess) dienen dazu, einen Dienst seinem Port zuzuordnen.
Beispiel zur Ermittlung des von einem bestimmten Agenten verwendeten Ports:
ss -ltup | grep zabbix_agentd
Außerdem muss die System-Firewall überprüft werden, um sicherzustellen, dass die erforderlichen Ports für externen Datenverkehr offen sind. Je nach Distribution wird entweder das Firewalld- oder das UFW-Dienstprogramm verwendet:
Für Firewalld:
firewall-cmd --list-services
firewall-cmd --list-ports
Für UFW:
sudo ufw status
Automatisierung der Dienstüberwachung und -wiederherstellung
Die manuelle Überwachung von Diensten ist in Produktionsumgebungen ineffizient. Die Automatisierung stellt sicher, dass Ausfälle protokolliert und ohne manuellen Eingriff behoben werden.
Geplante Protokollierung über Cron
Um einen Verlauf der laufenden Dienste zu führen, kann ein Cron-Job so konfiguriert werden, dass er alle fünf Minuten die Dienstliste exportiert:
*/5 * * * * systemctl list-units --type=service --state=running > /tmp/running_services.log
Automatische Neustarts implementieren
Um längere Ausfallzeiten zu vermeiden, kann systemd so konfiguriert werden, dass ein Dienst bei einem Ausfall automatisch neu gestartet wird. Dies erfolgt durch Bearbeiten der Dienst-Unit-Datei:
systemctl edit apache2
Die folgende Konfiguration wird zur Unit-Datei hinzugefügt:
[Service]
Restart=always
RestartSec=5s
Nach der Bearbeitung müssen der Systemmanager neu geladen und der Dienst neu gestartet werden, damit die Logik wirksam wird:
systemctl daemon-reload
systemctl restart apache2
Die Überprüfung der Neustart-Richtlinie kannst du mit folgendem Befehl durchführen: systemctl show apache2 --property=Restart
Sicherheitsoptimierung und Sicherheitsbeschränkungen
Um die Angriffsfläche eines Systems zu verringern, sollten Dienste auf die unbedingt notwendigen Berechtigungen beschränkt werden. Systemd bietet Sicherheitsrichtlinien, die im Abschnitt [Service] einer Unit-Datei hinzugefügt werden können:
- NoNewPrivileges=true: Verhindert, dass der Dienst und seine untergeordneten Prozesse über setuid- oder setgid-Bits neue Berechtigungen erhalten.
- ProtectSystem=full: Hängt /usr, /boot und /etc für den Dienst schreibgeschützt ein.
- PrivateTmp=true: Stellt dem Dienst ein eigenes, isoliertes /tmp-Verzeichnis zur Verfügung.
Fehlerbehebung und Erläuterungen im Betrieb
Was passiert, wenn ein Dienst als aktiv aufgeführt wird, der SUB-Zustand jedoch verlassen wurde?
Dies deutet in der Regel darauf hin, dass der Dienst seine vorgesehene Aufgabe ausgeführt und erfolgreich beendet hat. Das ist typisch für „One-Shot“-Dienste, die beim Bootvorgang ein Skript ausführen und sich anschließend beenden, dabei aber weiterhin als aktiv gelten, da sie nicht fehlgeschlagen sind.
Warum muss man „systemctl daemon-reload“ ausführen, nachdem man eine Unit-Datei geändert hat?
Systemd lädt Unit-Konfigurationen in den Arbeitsspeicher. Änderungen, die direkt an den Dateien auf der Festplatte vorgenommen werden, werden nicht automatisch erkannt. Der Befehl „daemon-reload“ zwingt systemd dazu, nach geänderten Units zu suchen und die Konfiguration im Arbeitsspeicher zu aktualisieren.
Wie kann ein Administrator zwischen einem Dienst, dessen Start fehlgeschlagen ist, und einem, der lediglich deaktiviert ist, unterscheiden?
Ein deaktivierter Dienst erscheint nicht in der list-units-Ausgabe, es sei denn, er wurde manuell gestartet. Ein fehlgeschlagener Dienst erscheint in der list-units-Ausgabe mit dem Status failed. Der Befehl **systemctl status [Dienst] ** liefert den spezifischen Exit-Code oder die Fehlermeldung, die mit dem Fehler verbunden ist.
Welches Tool ist effizienter für die Portüberprüfung: ss oder netstat?
Das Dienstprogramm ss ist effizienter, da es Informationen direkt aus dem TCP-Stack des Kernels abruft, während netstat aus dem Dateisystem /proc liest, was auf Systemen mit einer sehr hohen Anzahl aktiver Verbindungen langsamer sein kann.
Kann ein Dienst so konfiguriert werden, dass er nur bei bestimmten Fehlercodes neu gestartet wird?
Ja. Anstelle von Restart=always können Administratoren Restart=on-failure verwenden. Dadurch wird sichergestellt, dass der Dienst nur neu gestartet wird, wenn er mit einem Exit-Code ungleich Null beendet wird oder durch ein Signal beendet wird, wodurch unnötige Neustarts bei absichtlichen manuellen Abschaltungen verhindert werden.

