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:
| Merkmal | SysVinit | systemd |
|---|---|---|
| Dienstdefinition | Shell-Skripte in /etc/init.d/ | Deklarative Unit-Dateien in /etc/systemd/system/ |
| Startreihenfolge | Sequenziell (nacheinander) | Parallel (basierend auf Abhängigkeiten) |
| Abhängigkeitsverwaltung | Manuell mit Runlevel-Skripten | Automatisch mit Requires, After, Wants |
| Prozessverfolgung | PID-Dateien (unzuverlässig) | cgroups (Verfolgung auf Kernel-Ebene) |
| Protokollierung | syslog / separate Log-Dateien | journald (strukturiertes binäres Journal) |
| On-Demand-Aktivierung | Nicht eingebaut | Socket-Aktivierung, D-Bus-Aktivierung |
| Ressourcenkontrolle | Keine | cgroups (CPU-, Speicher-, I/O-Limits) |
| Boot-Ziele | Runlevels (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-Typ | Erweiterung | Zweck |
|---|---|---|
| Service | .service | Verwaltet einen Daemon oder einmaligen Prozess |
| Timer | .timer | Plant die Aktivierung von Diensten (Cron-Ersatz) |
| Socket | .socket | Verwaltet Socket-basierte Aktivierung |
| Mount | .mount | Verwaltet Dateisystem-Mountpunkte |
| Target | .target | Gruppiert Units zur Synchronisation |
| Path | .path | Überwacht Dateisystempfade auf Änderungen |
| Slice | .slice | Verwaltet cgroups-Ressourcenpartitionen |
| Device | .device | Verwaltet Kernel-Geräteknoten |
Speicherorte der Unit-Dateien
Unit-Dateien werden aus mehreren Verzeichnissen mit bestimmter Priorität geladen:
| Verzeichnis | Zweck | Priorität |
|---|---|---|
/etc/systemd/system/ | Lokale Administrator-Überschreibungen | Höchste |
/run/systemd/system/ | Laufzeit-Units (nicht persistent) | Mittel |
/lib/systemd/system/ | Von der Distribution bereitgestellte Units | Niedrigste |
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 wirdDocumentation— URL zur DokumentationAfter— diese Unit nach den aufgelisteten Units startenWants— 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ührenWorkingDirectory— das Arbeitsverzeichnis festlegenExecStart— der Befehl zum Starten des DienstesExecStartPre— Befehle, die vor dem Hauptprozess ausgeführt werdenExecStartPost— Befehle, die nach dem Start des Hauptprozesses ausgeführt werdenExecStop— der Befehl zum Stoppen des Dienstes (Standard ist SIGTERM)ExecReload— der Befehl zum Neuladen der KonfigurationRestart— 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 (üblicherweisemulti-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ätsstufe | Schlüsselwort | Numerisch |
|---|---|---|
| Notfall | emerg | 0 |
| Alarm | alert | 1 |
| Kritisch | crit | 2 |
| Fehler | err | 3 |
| Warnung | warning | 4 |
| Hinweis | notice | 5 |
| Information | info | 6 |
| Debug | debug | 7 |
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.serviceuntersuchen (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 wirdMemoryHigh— 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
| Befehl | Beschreibung |
|---|---|
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-units | Alle geladenen Units auflisten |
systemctl list-unit-files | Alle Unit-Dateien auflisten |
systemctl list-timers | Aktive 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> -f | Unit-Logs verfolgen |
systemd-analyze blame | Boot-Zeit pro Dienst anzeigen |
systemd-analyze critical-chain | Kritischen 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 normalinactive (dead)— der Dienst ist gestopptfailed— der Dienst ist abgestürzt oder konnte nicht gestartet werdenactivating (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
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
code=exited, status=203/EXEC | Binärdatei nicht gefunden oder nicht ausführbar | ExecStart-Pfad und Berechtigungen überprüfen |
code=exited, status=217/USER | Dienstbenutzer existiert nicht | Benutzer mit useradd erstellen |
code=exited, status=200/CHDIR | WorkingDirectory existiert nicht | Verzeichnis erstellen |
code=exited, status=1/FAILURE | Anwendungsfehler | journalctl-Logs prüfen |
| Dienst startet ständig neu | Absturzschleife | RestartSec prüfen, Anwendungslogs überprüfen |
code=killed, signal=KILL | OOM-Killer | MemoryMax 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
systemctlfü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
journalctlfür leistungsstarke Log-Filterung nach Dienst, Zeitbereich und Prioritätsstufe - Analysieren Sie die Boot-Performance mit
systemd-analyzeund 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.