systemd ist das Init-System und der Dienst-Manager, der praktisch jede moderne Linux-Distribution antreibt, darunter Ubuntu, Debian, Fedora, CentOS und Arch Linux. Es hat das traditionelle SysVinit-System abgelöst, um parallelen Dienststart, Abhängigkeitsverwaltung, On-Demand-Aktivierung und zentralisierte Protokollierung bereitzustellen. Ob Sie einen einzelnen Server oder eine Flotte von Produktionsmaschinen verwalten — das Verständnis von systemd ist essenziell für eine effektive Linux-Administration. Diese Anleitung behandelt systemctl-Befehle, benutzerdefinierte Unit-Dateien, Timer, Journal-Verwaltung, Boot-Analyse und Ressourcenkontrolle mit cgroups.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie haben:

  • Ubuntu Server 20.04, 22.04 oder 24.04 (oder eine beliebige systemd-basierte Distribution)
  • Terminalzugang mit sudo-Berechtigungen
  • Grundlegende Vertrautheit mit der Linux-Kommandozeile
  • Einen Texteditor (nano, vim oder Ihre Wahl)

Was Ist systemd?

systemd ist ein System- und Dienst-Manager für Linux. Es läuft als PID 1 — der erste Prozess, der vom Kernel gestartet wird — und ist verantwortlich für das Bootstrapping des gesamten Userspace, die Verwaltung von Diensten während ihres gesamten Lebenszyklus und das saubere Herunterfahren des Systems.

Kernkomponenten von systemd umfassen:

  • systemctl — das primäre Kommandozeilenwerkzeug zur Steuerung von Diensten und zur Inspektion des Systemzustands
  • journald — ein strukturiertes Protokollierungssystem, das Logs von allen Diensten, dem Kernel und dem frühen Boot sammelt
  • systemd-analyze — ein Werkzeug zur Profilerstellung und Optimierung der Boot-Performance
  • systemd-resolved — ein DNS-Auflösungsdienst
  • systemd-networkd — ein Netzwerkkonfigurationsmanager
  • systemd-logind — ein Anmelde- und Sitzungsmanager
  • systemd-tmpfiles — ein Werkzeug zur Verwaltung temporärer Dateien und Verzeichnisse

Überprüfen Sie, ob Ihr System systemd ausführt:

systemctl --version

Erwartete Ausgabe:

systemd 252 (252.22-1ubuntu1)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT ...

Prüfen Sie den allgemeinen Systemzustand:

systemctl status

Dies zeigt einen Baum der laufenden Dienste, ihre PIDs und die Speicherauslastung.

systemd vs SysVinit

Das Verständnis dessen, was sich gegenüber SysVinit geändert hat, hilft zu verdeutlichen, warum systemd so funktioniert, wie es funktioniert:

MerkmalSysVinitsystemd
DienstdefinitionShell-Skripte in /etc/init.d/Deklarative Unit-Dateien in /etc/systemd/system/
StartreihenfolgeSequenziell (nacheinander)Parallel (basierend auf Abhängigkeiten)
AbhängigkeitsverwaltungManuell mit Runlevel-SkriptenAutomatisch mit Requires, After, Wants
ProzessverfolgungPID-Dateien (unzuverlässig)cgroups (Verfolgung auf Kernel-Ebene)
Protokollierungsyslog / separate Log-Dateienjournald (strukturiertes binäres Journal)
On-Demand-AktivierungNicht eingebautSocket-Aktivierung, D-Bus-Aktivierung
RessourcenkontrolleKeinecgroups (CPU-, Speicher-, I/O-Limits)
Boot-ZieleRunlevels (0-6)Targets (multi-user.target, graphical.target)

Der entscheidende Vorteil von systemd ist die Zuverlässigkeit: Es verfolgt Prozesse über cgroups, sodass es immer weiß, welche Prozesse zu einem Dienst gehören, selbst wenn diese einen Fork ausführen. PID-Dateien, die von SysVinit verwendet wurden, waren eine häufige Ursache für veraltete Zustände und Fehler in der Dienstverwaltung.

Dienstverwaltung mit systemctl

systemctl ist der Befehl, den Sie am häufigsten verwenden werden. Er kommuniziert mit dem systemd-Manager, um Dienste zu steuern, ihren Status zu inspizieren und ihr Boot-Verhalten zu verwalten.

Dienste Starten und Stoppen

# Einen Dienst starten
sudo systemctl start nginx

# Einen Dienst stoppen
sudo systemctl stop nginx

# Einen Dienst neu starten (stoppen dann starten)
sudo systemctl restart nginx

# Konfiguration ohne Neustart neu laden (falls unterstützt)
sudo systemctl reload nginx

# Neu laden oder neu starten (neu laden falls unterstützt, sonst neu starten)
sudo systemctl reload-or-restart nginx

Dienststatus Prüfen

sudo systemctl status nginx

Beispielausgabe:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2026-01-29 10:15:30 UTC; 2h ago
       Docs: man:nginx(8)
    Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 1240 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 1241 (nginx)
      Tasks: 3 (limit: 4647)
     Memory: 8.2M
        CPU: 52ms
     CGroup: /system.slice/nginx.service
             ├─1241 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─1242 "nginx: worker process" "" "" "" "" "" "" "" "" ""
             └─1243 "nginx: worker process" "" "" "" "" "" "" "" "" ""

Wichtige Felder:

  • Loaded — ob die Unit-Datei geladen ist und wo sie sich befindet
  • Active — der aktuelle Zustand (active, inactive, failed)
  • Main PID — die Hauptprozess-ID des Dienstes
  • CGroup — alle Prozesse, die zu diesem Dienst gehören

Dienste Aktivieren und Deaktivieren

Einen Dienst zu aktivieren bedeutet, dass er automatisch beim Booten gestartet wird. Deaktivieren entfernt dieses Verhalten.

# Einen Dienst für den Boot aktivieren
sudo systemctl enable nginx

# Einen Dienst vom automatischen Start beim Booten deaktivieren
sudo systemctl disable nginx

# Aktivieren und starten in einem Befehl
sudo systemctl enable --now nginx

# Deaktivieren und stoppen in einem Befehl
sudo systemctl disable --now nginx

Aktivierungsstatus Prüfen

systemctl is-enabled nginx
# Ausgabe: enabled

systemctl is-active nginx
# Ausgabe: active

systemctl is-failed nginx
# Ausgabe: active (nicht fehlgeschlagen)

Dienste Auflisten

# Alle aktiven Dienste auflisten
systemctl list-units --type=service

# Alle Dienste auflisten (einschließlich inaktiver)
systemctl list-units --type=service --all

# Aktivierte Dienste auflisten
systemctl list-unit-files --type=service --state=enabled

# Fehlgeschlagene Dienste auflisten
systemctl list-units --type=service --state=failed

Unit-Dateien Verstehen

systemd verwaltet alles über Unit-Dateien — deklarative Konfigurationsdateien, die Dienste, Mountpunkte, Geräte, Sockets, Timer und mehr beschreiben.

Unit-Typen

Unit-TypErweiterungZweck
Service.serviceVerwaltet einen Daemon oder einmaligen Prozess
Timer.timerPlant die Aktivierung von Diensten (Cron-Ersatz)
Socket.socketVerwaltet Socket-basierte Aktivierung
Mount.mountVerwaltet Dateisystem-Mountpunkte
Target.targetGruppiert Units zur Synchronisation
Path.pathÜberwacht Dateisystempfade auf Änderungen
Slice.sliceVerwaltet cgroups-Ressourcenpartitionen
Device.deviceVerwaltet Kernel-Geräteknoten

Speicherorte der Unit-Dateien

Unit-Dateien werden aus mehreren Verzeichnissen mit bestimmter Priorität geladen:

VerzeichnisZweckPriorität
/etc/systemd/system/Lokale Administrator-ÜberschreibungenHöchste
/run/systemd/system/Laufzeit-Units (nicht persistent)Mittel
/lib/systemd/system/Von der Distribution bereitgestellte UnitsNiedrigste

Erstellen oder ändern Sie Units immer in /etc/systemd/system/. Bearbeiten Sie niemals Dateien in /lib/systemd/system/ direkt, da Paket-Updates Ihre Änderungen überschreiben.

Unit-Dateien Inspizieren

# Die vollständige Unit-Datei eines Dienstes anzeigen
systemctl cat nginx.service

# Alle Eigenschaften eines Dienstes anzeigen (effektive Konfiguration)
systemctl show nginx.service

# Eine bestimmte Eigenschaft anzeigen
systemctl show nginx.service -p MainPID
systemctl show nginx.service -p ActiveState

# Alle Abhängigkeiten eines Dienstes auflisten
systemctl list-dependencies nginx.service

Benutzerdefinierte Service-Units Erstellen

Eine der praktischsten systemd-Fähigkeiten ist das Schreiben eigener Service-Unit-Dateien. Damit können Sie jede Anwendung — von einem Node.js-Server über eine Go-Binary bis hin zu einem Python-Skript — als vollwertigen Systemdienst verwalten.

Grundlegende Service-Unit

Erstellen Sie eine Datei unter /etc/systemd/system/myapp.service:

[Unit]
Description=My Custom Application
Documentation=https://example.com/docs
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp --config /etc/myapp/config.yaml
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

[Install]
WantedBy=multi-user.target

Aufschlüsselung der Abschnitte

[Unit] — Metadaten und Abhängigkeiten:

  • Description — menschenlesbare Beschreibung, die in der Statusausgabe angezeigt wird
  • Documentation — URL zur Dokumentation
  • After — diese Unit nach den aufgelisteten Units starten
  • Wants — schwache Abhängigkeit (schlägt nicht fehl, wenn die Abhängigkeit fehlschlägt)
  • Requires — starke Abhängigkeit (schlägt fehl, wenn die Abhängigkeit fehlschlägt)

[Service] — Dienstverhalten:

  • Type — wie systemd feststellt, ob der Dienst bereit ist (simple, forking, oneshot, notify, idle)
  • User / Group — den Dienst als dieser Benutzer/Gruppe ausführen
  • WorkingDirectory — das Arbeitsverzeichnis festlegen
  • ExecStart — der Befehl zum Starten des Dienstes
  • ExecStartPre — Befehle, die vor dem Hauptprozess ausgeführt werden
  • ExecStartPost — Befehle, die nach dem Start des Hauptprozesses ausgeführt werden
  • ExecStop — der Befehl zum Stoppen des Dienstes (Standard ist SIGTERM)
  • ExecReload — der Befehl zum Neuladen der Konfiguration
  • Restart — wann neu gestartet werden soll (no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, always)
  • RestartSec — Wartezeit vor dem Neustart

[Install] — Installationsverhalten:

  • WantedBy — das Target, das diesen Dienst einschließen soll (üblicherweise multi-user.target)

Diensttypen Erklärt

# Simple (Standard): ExecStart ist der Hauptprozess
Type=simple

# Forking: der Prozess forkt und der Elternprozess beendet sich (traditionelle Daemons)
Type=forking
PIDFile=/run/myapp.pid

# Oneshot: der Prozess läuft bis zum Ende und beendet sich dann
Type=oneshot
RemainAfterExit=yes

# Notify: der Prozess sendet eine Benachrichtigung, wenn er bereit ist
Type=notify

# Idle: wie simple, wartet aber bis alle Jobs verteilt sind
Type=idle

Den Dienst Aktivieren

Nach dem Erstellen oder Ändern einer Unit-Datei laden Sie den systemd-Daemon neu und verwalten den Dienst:

# systemd neu laden, um neue/geänderte Unit-Dateien einzulesen
sudo systemctl daemon-reload

# Den Dienst starten
sudo systemctl start myapp

# Den Status prüfen
sudo systemctl status myapp

# Beim Booten aktivieren
sudo systemctl enable myapp

Bestehende Units Überschreiben

Anstatt vom Anbieter bereitgestellte Unit-Dateien zu bearbeiten, verwenden Sie Drop-in-Überschreibungen:

# Ein Überschreibungsverzeichnis und eine Datei erstellen
sudo systemctl edit nginx.service

Dies öffnet einen Editor für /etc/systemd/system/nginx.service.d/override.conf. Fügen Sie nur die Direktiven hinzu, die Sie ändern möchten:

[Service]
LimitNOFILE=65535

Um die effektive Konfiguration nach Überschreibungen anzuzeigen:

systemctl cat nginx.service

systemd-Timer

systemd-Timer sind ein moderner Ersatz für Cron-Jobs. Sie bieten persistente Planung (Nachholen verpasster Ausführungen), Protokollierung pro Timer und Integration mit der cgroups-Ressourcenkontrolle.

Struktur der Timer-Unit

Ein Timer benötigt zwei Dateien: eine .timer-Unit und eine entsprechende .service-Unit mit demselben Namen.

Erstellen Sie /etc/systemd/system/backup.timer:

[Unit]
Description=Run backup every day at 2:00 AM

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target

Erstellen Sie /etc/systemd/system/backup.service:

[Unit]
Description=System Backup Service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=root
StandardOutput=journal
StandardError=journal

Timer-Typen

Kalenderbasiert (OnCalendar):

# Jeden Tag um Mitternacht
OnCalendar=daily

# Jeden Montag um 3 Uhr morgens
OnCalendar=Mon *-*-* 03:00:00

# Alle 6 Stunden
OnCalendar=*-*-* 00/6:00:00

# Erster Tag jedes Monats
OnCalendar=*-*-01 00:00:00

# Alle 15 Minuten
OnCalendar=*-*-* *:00/15:00

Monoton (relativ zu einem Ereignis):

# 5 Minuten nach dem Booten
OnBootSec=5min

# 1 Stunde nach der Aktivierung des Timers
OnActiveSec=1h

# 30 Minuten nach Abschluss des letzten Laufs
OnUnitActiveSec=30min

Timer Verwalten

# Neu laden, aktivieren und den Timer starten
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

# Alle aktiven Timer auflisten
systemctl list-timers --all

# Den Timer-Status prüfen
systemctl status backup.timer

# Den zugehörigen Dienst manuell testen
sudo systemctl start backup.service

Kalenderausdrücke Überprüfen

Verwenden Sie systemd-analyze calendar, um Ihre Timer-Ausdrücke zu testen:

systemd-analyze calendar "Mon *-*-* 03:00:00"

Ausgabe:

  Original form: Mon *-*-* 03:00:00
Normalized form: Mon *-*-* 03:00:00
    Next elapse: Mon 2026-02-02 03:00:00 UTC
       (in UTC): Mon 2026-02-02 03:00:00 UTC
       From now: 3 days left

Journal- und Log-Verwaltung mit journalctl

journald ist die Protokollierungskomponente von systemd. Es sammelt Logs von allen Diensten, dem Kernel und dem frühen Boot-Prozess in einem strukturierten binären Journal, das schnelle Suchen, Filterung und Export unterstützt.

Grundlegende journalctl-Nutzung

# Alle Logs anzeigen (älteste zuerst)
journalctl

# Die neuesten Einträge anzeigen (neueste zuerst)
journalctl -r

# Logs in Echtzeit verfolgen
journalctl -f

# Logs seit dem letzten Boot anzeigen
journalctl -b

# Logs vom vorherigen Boot anzeigen
journalctl -b -1

Nach Dienst Filtern

# Logs für einen bestimmten Dienst
journalctl -u nginx.service

# Einen bestimmten Dienst in Echtzeit verfolgen
journalctl -u nginx.service -f

# Logs für mehrere Dienste
journalctl -u nginx.service -u php-fpm.service

Nach Zeit Filtern

# Logs seit einem bestimmten Zeitpunkt
journalctl --since "2026-01-29 10:00:00"

# Logs in einem Zeitbereich
journalctl --since "2026-01-29 10:00:00" --until "2026-01-29 12:00:00"

# Logs der letzten Stunde
journalctl --since "1 hour ago"

# Logs von heute
journalctl --since today

Nach Priorität Filtern

journalctl unterstützt Syslog-Prioritätsstufen:

# Nur Fehler und höher anzeigen
journalctl -p err

# Warnungen und höher anzeigen
journalctl -p warning

# Kritisch und höher anzeigen
journalctl -p crit
PrioritätsstufeSchlüsselwortNumerisch
Notfallemerg0
Alarmalert1
Kritischcrit2
Fehlererr3
Warnungwarning4
Hinweisnotice5
Informationinfo6
Debugdebug7

Ausgabeformate

# JSON-Ausgabe (zur Verarbeitung)
journalctl -u nginx.service -o json-pretty

# Kurze Ausgabe mit präzisen Zeitstempeln
journalctl -u nginx.service -o short-precise

# Ausführliche Ausgabe mit allen Feldern
journalctl -u nginx.service -o verbose

Journal-Größe Verwalten

# Aktuelle Festplattennutzung prüfen
journalctl --disk-usage

# Nur die letzten 2 Wochen an Logs behalten
sudo journalctl --vacuum-time=2weeks

# Journal-Größe auf 500 MB begrenzen
sudo journalctl --vacuum-size=500M

# Archivierte Journals entfernen
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s

Für eine dauerhafte Konfiguration bearbeiten Sie /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxRetentionSec=2week

Dann starten Sie journald neu:

sudo systemctl restart systemd-journald

Analyse der Boot-Performance

systemd stellt integrierte Werkzeuge zur Messung und Optimierung der Boot-Zeiten bereit.

Gesamte Boot-Zeit

systemd-analyze

Ausgabe:

Startup finished in 3.245s (kernel) + 8.712s (userspace) = 11.957s
graphical.target reached after 8.510s in userspace.

Aufschlüsselung nach Dienst

# Dienste sortiert nach Startzeit auflisten
systemd-analyze blame

Ausgabe:

5.012s NetworkManager-wait-online.service
1.234s snapd.service
  892ms docker.service
  456ms nginx.service
  234ms ssh.service
  ...

Kritische Kette

Die kritische Kette zeigt die Abfolge von Units, die die gesamte Boot-Zeit bestimmt haben:

systemd-analyze critical-chain

Ausgabe:

graphical.target @8.510s
└─multi-user.target @8.508s
  └─nginx.service @8.052s +456ms
    └─network-online.target @8.050s
      └─NetworkManager-wait-online.service @3.038s +5.012s
        └─NetworkManager.service @2.890s +145ms
          └─basic.target @2.880s

SVG-Boot-Diagramm

Generieren Sie eine visuelle Zeitleiste des Boot-Vorgangs:

systemd-analyze plot > boot-chart.svg

Öffnen Sie die SVG-Datei in einem Webbrowser, um eine detaillierte grafische Darstellung der Dienst-Startzeiten und Abhängigkeiten zu sehen.

Langsame Dienste Identifizieren

# Dienste finden, die langsam starten
systemd-analyze blame | head -20

# Prüfen, ob ein bestimmter Dienst den Boot verzögert
systemd-analyze critical-chain nginx.service

Gängige Strategien zur Boot-Optimierung:

  • Dienste deaktivieren, die Sie nicht benötigen (sudo systemctl disable Dienstname)
  • Dienste maskieren, die Sie niemals ausführen möchten (sudo systemctl mask Dienstname)
  • NetworkManager-wait-online.service untersuchen (eine häufige Ursache für Boot-Verzögerungen)
  • Socket-Aktivierung für Dienste verwenden, die nicht sofort benötigt werden

Ressourcenkontrolle mit Cgroups

systemd verwendet Linux Control Groups (cgroups), um die für jeden Dienst verfügbaren Ressourcen zu verwalten und zu begrenzen. Dies verhindert, dass ein fehlerhafter Dienst alle Systemressourcen verbraucht.

Aktuelle Ressourcennutzung Anzeigen

# Ressourcennutzung nach Slice anzeigen
systemd-cgtop

Speicherlimits Setzen

Fügen Sie Ressourcendirektiven zum Abschnitt [Service] einer Unit-Datei hinzu:

[Service]
MemoryMax=512M
MemoryHigh=400M
  • MemoryMax — hartes Limit; der OOM-Killer greift ein, wenn es überschritten wird
  • MemoryHigh — weiches Limit; der Kernel drosselt den Dienst bei Überschreitung

CPU-Limits Setzen

[Service]
CPUQuota=50%
CPUWeight=100
  • CPUQuota — begrenzt den Dienst auf einen Prozentsatz eines einzelnen CPU-Kerns (200% = zwei Kerne)
  • CPUWeight — relatives Gewicht für die CPU-Zeitverteilung (Standard ist 100)

I/O-Limits Setzen

[Service]
IOWeight=50
IOReadBandwidthMax=/dev/sda 10M
IOWriteBandwidthMax=/dev/sda 5M

Limits zur Laufzeit Anwenden

Sie können Ressourcenlimits temporär anwenden, ohne Unit-Dateien zu ändern:

# Speicher für einen laufenden Dienst begrenzen
sudo systemctl set-property nginx.service MemoryMax=512M

# CPU für einen laufenden Dienst begrenzen
sudo systemctl set-property nginx.service CPUQuota=50%

# Die Änderung dauerhaft machen
sudo systemctl set-property nginx.service MemoryMax=512M --runtime=false

Effektive Limits Anzeigen

systemctl show nginx.service -p MemoryMax -p CPUQuota -p IOWeight

systemctl-Befehlsreferenz

BefehlBeschreibung
systemctl start <Unit>Eine Unit starten
systemctl stop <Unit>Eine Unit stoppen
systemctl restart <Unit>Eine Unit neu starten
systemctl reload <Unit>Unit-Konfiguration neu laden
systemctl enable <Unit>Unit beim Booten aktivieren
systemctl disable <Unit>Unit beim Booten deaktivieren
systemctl enable --now <Unit>Aktivieren und sofort starten
systemctl status <Unit>Unit-Status anzeigen
systemctl is-active <Unit>Prüfen, ob die Unit läuft
systemctl is-enabled <Unit>Prüfen, ob die Unit aktiviert ist
systemctl is-failed <Unit>Prüfen, ob die Unit fehlgeschlagen ist
systemctl list-unitsAlle geladenen Units auflisten
systemctl list-unit-filesAlle Unit-Dateien auflisten
systemctl list-timersAktive Timer auflisten
systemctl daemon-reloadÄnderungen an Unit-Dateien neu laden
systemctl cat <Unit>Inhalt der Unit-Datei anzeigen
systemctl show <Unit>Alle Unit-Eigenschaften anzeigen
systemctl edit <Unit>Drop-in-Überschreibung erstellen
systemctl mask <Unit>Unit am Starten hindern
systemctl unmask <Unit>Maskierung von Unit entfernen
systemctl list-dependencies <Unit>Unit-Abhängigkeiten anzeigen
systemctl set-property <Unit> <Schlüssel>=<Wert>Laufzeit-Eigenschaft setzen
journalctl -u <Unit>Unit-Logs anzeigen
journalctl -u <Unit> -fUnit-Logs verfolgen
systemd-analyze blameBoot-Zeit pro Dienst anzeigen
systemd-analyze critical-chainKritischen Boot-Pfad anzeigen

Fehlerbehebung bei Fehlgeschlagenen Diensten

Wenn ein Dienst fehlschlägt, folgen Sie diesem systematischen Ansatz zur Diagnose und Behebung des Problems.

Schritt 1: Den Status Prüfen

sudo systemctl status myapp.service

Suchen Sie nach der Zeile Active. Häufige Zustände:

  • active (running) — der Dienst läuft normal
  • inactive (dead) — der Dienst ist gestoppt
  • failed — der Dienst ist abgestürzt oder konnte nicht gestartet werden
  • activating (auto-restart) — der Dienst wird neu gestartet

Schritt 2: Die Logs Lesen

# Vollständige Logs des Dienstes
journalctl -u myapp.service --no-pager

# Letzte 50 Zeilen
journalctl -u myapp.service -n 50

# Nur Fehler
journalctl -u myapp.service -p err

Schritt 3: Die Unit-Datei Validieren

# Auf Syntaxfehler prüfen
systemd-analyze verify /etc/systemd/system/myapp.service

Schritt 4: Den Befehl Manuell Testen

Führen Sie den ExecStart-Befehl manuell als Dienstbenutzer aus, um zu prüfen, ob die Anwendung selbst funktioniert:

sudo -u myapp /opt/myapp/bin/myapp --config /etc/myapp/config.yaml

Schritt 5: Häufige Probleme Prüfen

Berechtigungsfehler:

# Überprüfen, ob die Binärdatei ausführbar ist
ls -la /opt/myapp/bin/myapp

# Überprüfen, ob der Benutzer existiert
id myapp

# Verzeichnisberechtigungen prüfen
ls -la /opt/myapp/

Fehlende Abhängigkeiten:

# Auf fehlende gemeinsam genutzte Bibliotheken prüfen
ldd /opt/myapp/bin/myapp

Portkonflikte:

# Prüfen, ob der Port bereits in Verwendung ist
ss -tlnp | grep :8080

Schritt 6: Einen Fehlgeschlagenen Dienst Zurücksetzen

# Den Fehlerzustand zurücksetzen
sudo systemctl reset-failed myapp.service

# Erneut versuchen zu starten
sudo systemctl start myapp.service

Häufige Fehlermuster

SymptomWahrscheinliche UrsacheLösung
code=exited, status=203/EXECBinärdatei nicht gefunden oder nicht ausführbarExecStart-Pfad und Berechtigungen überprüfen
code=exited, status=217/USERDienstbenutzer existiert nichtBenutzer mit useradd erstellen
code=exited, status=200/CHDIRWorkingDirectory existiert nichtVerzeichnis erstellen
code=exited, status=1/FAILUREAnwendungsfehlerjournalctl-Logs prüfen
Dienst startet ständig neuAbsturzschleifeRestartSec prüfen, Anwendungslogs überprüfen
code=killed, signal=KILLOOM-KillerMemoryMax erhöhen oder Anwendung optimieren

Zusammenfassung

systemd ist das Rückgrat der Dienstverwaltung auf modernen Linux-Systemen. Es bietet einen einheitlichen, deklarativen Ansatz zur Verwaltung von Diensten, Planung von Aufgaben, Steuerung von Ressourcen und Analyse des Systemverhaltens. Die Beherrschung von systemctl, Unit-Dateien, Timern und journalctl gibt Ihnen die vollständige Kontrolle über den Betrieb Ihrer Linux-Server.

Wichtige Erkenntnisse:

  • Verwenden Sie systemctl für alle Dienstverwaltungsaufgaben: Starten, Stoppen, Aktivieren, Deaktivieren und Statusprüfung
  • Schreiben Sie benutzerdefinierte Unit-Dateien in /etc/systemd/system/, um Ihre eigenen Anwendungen als vollwertige Systemdienste zu verwalten
  • Ersetzen Sie Cron-Jobs durch systemd-Timer für persistente Planung, Protokollierung pro Aufgabe und Ressourcenkontrolle
  • Verwenden Sie journalctl für leistungsstarke Log-Filterung nach Dienst, Zeitbereich und Prioritätsstufe
  • Analysieren Sie die Boot-Performance mit systemd-analyze und deaktivieren Sie unnötige Dienste, um den Start zu beschleunigen
  • Wenden Sie cgroups-Ressourcenlimits (MemoryMax, CPUQuota) an, um zu verhindern, dass Dienste das System aushungern
  • Verwenden Sie Drop-in-Überschreibungen (systemctl edit) anstatt Anbieter-Unit-Dateien zu bearbeiten

Für einen umfassenderen Ansatz zur Absicherung Ihrer Linux-Server lesen Sie unsere Sicherheits-Checkliste für Linux-Server und den Leitfaden zur UFW-Firewall-Konfiguration.