Zum Inhalt springen

systemd

systemd ist auf den meisten modernen Linux-Distributionen der Init-Prozess (PID 1) — das erste Programm, das der Kernel startet. Es ist dafür zuständig, alle weiteren Dienste in der richtigen Reihenfolge zu starten und zu überwachen.

Alles in systemd wird über sogenannte Units konfiguriert — Konfigurationsdateien mit festgelegten Typen:

TypEndungBedeutung
Service.serviceHintergrrunddienst (Daemon)
Timer.timerZeitgesteuerter Auftrag (cron-Ersatz)
Socket.socketSocket-aktivierter Dienst
Target.targetGruppe von Units (Abhängigkeitspunkt)
Mount.mountEinhängepunkt
Device.deviceGerätedatei

Unit-Dateien liegen in:

  • /lib/systemd/system/ — von Paketen installiert (nicht bearbeiten)
  • /etc/systemd/system/ — lokale Konfiguration (Overrides)
  • ~/.config/systemd/user/ — Benutzer-Units
Terminal-Fenster
# Status eines Dienstes anzeigen
systemctl status nginx
# Dienst starten / stoppen / neustarten
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
# Dienst beim Systemstart aktivieren / deaktivieren
systemctl enable nginx
systemctl disable nginx
# Direkt starten und aktivieren in einem Schritt
systemctl enable --now nginx
# Alle laufenden Dienste anzeigen
systemctl list-units --type=service --state=running
# Alle fehlgeschlagenen Units anzeigen
systemctl --failed
Terminal-Fenster
systemctl reboot # Neustart
systemctl poweroff # Herunterfahren
systemctl halt # CPU anhalten (ohne Strom abschalten)
systemctl suspend # Ruhemodus (RAM)
systemctl hibernate # Tiefschlaf (Festplatte)

Targets gruppieren Units und definieren Systemzustände (früher: Runlevel):

TargetBeschreibungRunlevel
poweroff.targetSystem ausschalten0
rescue.targetEinzelbenutzer-Modus1
multi-user.targetMehrbenutzer ohne GUI3
graphical.targetMehrbenutzer mit GUI5
reboot.targetNeustart6
Terminal-Fenster
systemctl get-default # aktuelles Standard-Target anzeigen
systemctl set-default multi-user.target # Standard-Target setzen
systemctl isolate rescue.target # sofort in rescue-Modus wechseln

systemd protokolliert alle Dienst-Ausgaben im Journal:

Terminal-Fenster
journalctl # gesamtes Journal (älteste zuerst)
journalctl -f # neue Einträge live verfolgen (wie tail -f)
journalctl -u nginx # nur Logs von nginx
journalctl -u nginx -f # nginx-Logs live verfolgen
journalctl -b # Logs seit dem letzten Boot
journalctl -b -1 # Logs vom vorletzten Boot
journalctl --since "2024-01-01" # Logs ab einem Datum
journalctl --since "1 hour ago" # Logs der letzten Stunde
journalctl -p err # nur Fehler (err, warning, info, debug)
journalctl -xe # letzte Einträge mit Kontext (gut nach Fehlern)

Beispiel: einen einfachen Dienst einrichten, der ein Python-Skript ausführt:

/etc/systemd/system/mein-dienst.service
[Unit]
Description=Mein eigener Dienst
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/mein-app
ExecStart=/usr/bin/python3 /opt/mein-app/server.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Terminal-Fenster
systemctl daemon-reload # systemd über neue Datei informieren
systemctl enable --now mein-dienst
Terminal-Fenster
systemd-analyze # Bootzeit anzeigen
systemd-analyze blame # Dienste nach Bootzeit sortiert
systemd-analyze critical-chain # kritischer Pfad beim Booten
systemctl list-dependencies nginx # Abhängigkeiten eines Dienstes