Sparen Sie 15% bei allen Hosting-Diensten

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code: Skills Anfangen
Abschnitte
Linux Verwaltung Virtuelle Server

Wie man systemd verwendet, um einen Linux-Service beim Booten zu starten

Die Sicherstellung, dass kritische Dienste beim Neustart Ihres Servers automatisch starten, ist eine der grundlegendsten Aufgaben jedes Linux-Systemadministrators. Egal ob Sie eine Webanwendung, eine Datenbank-Engine oder einen benutzerdefinierten Daemon in einer VPS Hosting-Umgebung ausführen – ein unerwarteter Neustart sollte niemals zu längeren Ausfallzeiten führen. Mit systemd – dem modernen Init-System, das die Mehrheit der heutigen Linux-Distributionen antreibt – können Sie präzise definieren, wie, wann und als wer Ihre Dienste starten, alles durch eine saubere, deklarative Unit-Datei.

Dieser umfassende Leitfaden führt Sie durch jeden Schritt: Verständnis von systemd, Erstellung einer produktionsreifen Service-Unit-Datei, Überprüfung von Berechtigungen, Testen Ihrer ausführbaren Datei und Verwaltung des Service-Lebenszyklus. Am Ende wird Ihre benutzerdefinierte Anwendung bei jedem Neustart automatisch verfügbar sein.

Was ist systemd und warum ist es wichtig?

systemd ist ein Init-System und Service-Manager, der ältere Alternativen wie SysVinit und Upstart auf den meisten großen Linux-Distributionen ersetzt hat, einschließlich Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux und Fedora. Anstatt eine sequenzielle Kette von Shell-Skripten beim Booten auszuführen, parallelisiert systemd den Service-Start, löst Abhängigkeitsreihenfolgen auf und verwaltet den gesamten Lebenszyklus von Systemprozessen über eine einzige, einheitliche Schnittstelle.

Wichtigste Vorteile von systemd für Server-Umgebungen

FunktionVorteil
Paralleler Service-StartSchnellere Bootzeiten auf Multi-Service-Servern
AbhängigkeitsverwaltungServices starten nur nach ihren Voraussetzungen
Automatische NeustartrichtlinienAbgestürzte Services werden ohne manuelle Eingriffe wiederhergestellt
Zentralisierte Protokollierung über journaldAlle Service-Ausgaben werden in einem durchsuchbaren Journal erfasst
Cgroup-basierte RessourcenkontrolleCPU- und Speicherlimits werden pro Service erzwungen
Socket- und Device-AktivierungServices starten bei Bedarf, nicht bedingungslos

Für jeden, der Anwendungen auf Dedicated Servers oder VPS-Instanzen verwaltet, führen diese Funktionen direkt zu höherer Verfügbarkeit und vorhersehbarerem Verhalten unter Last.

Grundlagen von systemd Unit-Dateien

Alles, was systemd verwaltet, wird durch eine Unit-Datei dargestellt — eine Klartextkonfigurationsdatei, die in Abschnitte unterteilt ist. Eine .service Unit-Datei teilt systemd mit:

  • Was der Service ist (Metadaten, Beschreibung, Abhängigkeiten)
  • Wie er ausgeführt wird (ausführbarer Pfad, Arbeitsverzeichnis, Benutzerkontext)
  • Wann er gestartet wird (Boot-Ziel, Reihenfolge relativ zu anderen Units)
  • Was zu tun ist, wenn er fehlschlägt (Neustartrichtlinie, Neustartverz­ögerung)

Service Unit-Dateien für systemweite Services befinden sich in /etc/systemd/system/. Dateien, die hier platziert werden, haben Vorrang vor von Anbietern bereitgestellten Units in /lib/systemd/system/ und bleiben über Paketaktualisierungen hinweg erhalten.

Schritt für Schritt: Erstellen einer systemd-Service-Unit

Die folgende Anleitung verwendet eine fiktive Anwendung namens myapp. Ersetzen Sie jede Instanz von myapp, myuser und /usr/bin/myapp durch Werte, die für Ihre Umgebung geeignet sind.

Schritt 1: Arbeitsverzeichnis vorbereiten

Bevor Sie die Unit-Datei schreiben, entscheiden Sie, von wo aus Ihre Anwendung ausgeführt wird. Ein dediziertes Arbeitsverzeichnis hält Konfigurationsdateien, Protokolle und Laufzeitdaten organisiert und macht die Berechtigungsverwaltung unkompliziert.

Erstellen Sie das Verzeichnis, falls es noch nicht vorhanden ist:

sudo mkdir -p /opt/myapp

> Warum /opt/ statt /etc/systemd/?

> Der /etc/systemd/-Baum ist für systemds eigene Konfiguration reserviert. Das Platzieren von Anwendungsdaten dort ist nicht standardisiert und kann zu Verwirrung führen. Verwenden Sie /opt/myapp, /srv/myapp oder /var/lib/myapp je nachdem, welche Kategorie des Filesystem Hierarchy Standard am besten zu Ihrer Workload passt.

Weisen Sie dem Benutzer, der den Service ausführt, die Eigenschaft zu:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myuser
sudo chown -R myuser:myuser /opt/myapp

Die Verwendung eines dedizierten Systemkontos (keine Login-Shell, kein Home-Verzeichnis) ist eine Sicherheitsbest Practice. Dies begrenzt den Schadensumfang, falls die Anwendung jemals kompromittiert wird.

Überprüfen Sie das Ergebnis:

ls -ld /opt/myapp
# Expected output: drwxr-xr-x 2 myuser myuser 4096 Jan 1 00:00 /opt/myapp

Schritt 2: Service-Unit-Datei erstellen

Öffnen Sie eine neue Unit-Datei mit Ihrem bevorzugten Editor:

sudo nano /etc/systemd/system/myapp.service

Fügen Sie den folgenden Inhalt ein und passen Sie die Werte an Ihre Anwendung an:

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

[Service]
Type=simple
ExecStart=/usr/bin/myapp --config /opt/myapp/myapp.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Speichern Sie die Datei mit Ctrl+O und beenden Sie sie mit Ctrl+X.

Schritt 3: Jede Direktive verstehen

[Unit]-Sektion

DirektiveZweck
DescriptionBenutzerfreundlicher Name, der in der systemctl status-Ausgabe angezeigt wird
DocumentationURL oder Man-Page-Referenz für den Service
AfterStellt sicher, dass der Service *nach* der aufgelisteten Unit aktiv ist
WantsSoft Dependency — systemd wird *versuchen*, die aufgelistete Unit zu starten, schlägt aber nicht fehl, wenn sie nicht verfügbar ist

> network-online.target vs network.target: Verwenden Sie network-online.target (kombiniert mit Wants=network-online.target) für Services, die wirklich eine vollständig konfigurierte Netzwerkschnittstelle benötigen — zum Beispiel eine Anwendung, die beim Start eine Verbindung zu einer Remote-Datenbank oder einer externen API herstellt. network.target garantiert nur, dass das Netzwerk-Subsystem *gestartet* wurde, nicht dass Schnittstellen aktiv sind und Adressen zugewiesen sind.

[Service]-Sektion

DirektiveZweck
Type=simpleDer von ExecStart gestartete Prozess ist der Hauptprozess (Standard für die meisten Anwendungen)
ExecStartVollständiger Pfad zur Binärdatei und alle Argumente. Verwenden Sie immer absolute Pfade.
ExecReloadBefehl zum Neuladen der Konfiguration ohne vollständigen Neustart (optional, aber empfohlen)
Restart=on-failureStarten Sie den Service nur neu, wenn er mit einem Nicht-Null-Code beendet wird oder von einem Signal getötet wird. Verwenden Sie always, wenn Sie Neustarts auch bei sauberen Beendigungen wünschen.
RestartSecSekunden zum Warten vor dem Versuch eines Neustarts
User / GroupFühren Sie den Prozess als dieser Benutzer/diese Gruppe statt als Root aus
WorkingDirectoryLegen Sie das aktuelle Verzeichnis fest, bevor Sie ExecStart ausführen
StandardOutput / StandardErrorLeiten Sie stdout/stderr zum systemd-Journal weiter
SyslogIdentifierTag zum Filtern von Journal-Einträgen für diesen Service
NoNewPrivilegesVerhindert, dass der Prozess zusätzliche Berechtigungen über setuid-Binärdateien erhält
ProtectSystem=strictBindet /usr, /boot und /etc als schreibgeschützt für den Service ein
ProtectHomeMacht /home, /root und /run/user unzugänglich
PrivateTmpGibt dem Service seinen eigenen privaten /tmp-Namespace

[Install]-Sektion

DirektiveZweck
WantedBy=multi-user.targetAktiviert den Service, wenn das System die Standard-Multi-User-Runlevel (nicht grafisch) erreicht. Dies ist das richtige Ziel für praktisch alle Server-Daemons.

Schritt 4: Datei- und Verzeichnisberechtigungen überprüfen

Bevor Sie systemd neu laden, bestätigen Sie, dass der Service-Benutzer tatsächlich auf alles zugreifen kann, das er benötigt:

# Check working directory ownership and permissions
ls -ld /opt/myapp

# Confirm the executable exists and is executable
ls -l /usr/bin/myapp

# Verify the config file is readable by myuser
sudo -u myuser cat /opt/myapp/myapp.conf

Wenn eine dieser Überprüfungen fehlschlägt, korrigieren Sie die Berechtigungen, bevor Sie fortfahren:

# Make the binary executable
sudo chmod +x /usr/bin/myapp

# Grant read access to the config file
sudo chmod 640 /opt/myapp/myapp.conf
sudo chown myuser:myuser /opt/myapp/myapp.conf

Schritt 5: Die ausführbare Datei manuell testen

Überprüfen Sie immer, dass Ihre Anwendung korrekt ausgeführt wird, *bevor* Sie die Kontrolle an systemd übergeben. Dies isoliert Anwendungsfehler von systemd-Konfigurationsproblemen:

sudo -u myuser /usr/bin/myapp --config /opt/myapp/myapp.conf

Wenn die Anwendung ohne Fehler startet, drücken Sie Ctrl+C, um sie zu stoppen und fortzufahren. Wenn sie fehlschlägt, beheben Sie die Anwendung selbst — überprüfen Sie, dass alle Abhängigkeiten installiert sind, Umgebungsvariablen gesetzt sind und erforderliche Ports verfügbar sind.

Schritt 6: systemd neu laden und den Service aktivieren

Nachdem Sie die Unit-Datei gespeichert haben, weisen Sie systemd an, seine Konfiguration neu zu lesen:

sudo systemctl daemon-reload

Aktivieren Sie den Service, damit er bei jedem nachfolgenden Boot automatisch startet:

sudo systemctl enable myapp.service

Dieser Befehl erstellt einen Symlink im entsprechenden .wants-Verzeichnis und verlinkt Ihre Unit-Datei in die multi-user.target-Boot-Sequenz. Sie sollten eine Ausgabe ähnlich dieser sehen:

Created symlink /etc/systemd/system/multi-user.target.wants/myapp.service → /etc/systemd/system/myapp.service.

Starten Sie den Service sofort ohne Neustart:

sudo systemctl start myapp.service

Schritt 7: Überprüfen Sie, ob der Service ausgeführt wird

Überprüfen Sie den aktuellen Status des Service:

sudo systemctl status myapp.service

Ein gesunder Service erzeugt eine Ausgabe wie diese:

● myapp.service - My Custom Application
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2025-01-01 12:00:00 UTC; 5s ago
   Main PID: 12345 (myapp)
      Tasks: 4 (limit: 4915)
     Memory: 12.3M
        CPU: 45ms
     CGroup: /system.slice/myapp.service
             └─12345 /usr/bin/myapp --config /opt/myapp/myapp.conf

Wichtige Felder zum Überprüfen:

  • Loaded — bestätigt, dass die Unit-Datei erfolgreich analysiert wurde und zeigt, ob sie enabled oder disabled für Boot ist
  • Active: active (running) — der Service wird derzeit ausgeführt
  • Main PID — die Prozess-ID Ihrer Anwendung

Schritt 8: Protokolle mit journalctl überwachen

systemd leitet alle Service-Ausgaben zum Journal weiter, einem strukturierten, abfragbaren Protokollspeicher. Verwenden Sie journalctl um es zu überprüfen:

# View all logs for myapp (most recent last)
journalctl -u myapp.service

# Follow live log output (like tail -f)
journalctl -u myapp.service -f

# Show only logs since the last boot
journalctl -u myapp.service -b

# Show the last 50 lines
journalctl -u myapp.service -n 50

# Show logs since a specific time
journalctl -u myapp.service --since "2025-01-01 12:00:00"

Wenn Ihr Service nicht startet, enthält das Journal fast immer die genaue Fehlermeldung, die erklärt, warum. Dies ist der erste Ort, an dem Sie nachschauen sollten, bevor Sie Änderungen vornehmen.

Schritt 9: Boot-Verhalten testen

Um zu bestätigen, dass der Service einen Neustart übersteht, ohne die Boot-Sequenz manuell zu überprüfen, können Sie ihn simulieren:

# Reboot the server (only if safe to do so)
sudo reboot

Nachdem der Server wieder online ist, überprüfen Sie den Service-Status erneut:

sudo systemctl status myapp.service

Wenn es active (running) anzeigt, ist Ihr Service korrekt für automatisches Starten konfiguriert.

Verwaltung des Service-Lebenszyklus

Sobald Ihr Service läuft, werden Sie die folgenden Befehle regelmäßig verwenden:

Häufige systemctl-Befehle

# Start the service
sudo systemctl start myapp.service

# Stop the service gracefully
sudo systemctl stop myapp.service

# Restart the service (stop + start)
sudo systemctl restart myapp.service

# Reload configuration without restarting (if ExecReload is defined)
sudo systemctl reload myapp.service

# Enable automatic startup at boot
sudo systemctl enable myapp.service

# Disable automatic startup at boot
sudo systemctl disable myapp.service

# Check whether the service is enabled
sudo systemctl is-enabled myapp.service

# Check whether the service is currently active
sudo systemctl is-active myapp.service

# View the full unit file as systemd interprets it
sudo systemctl cat myapp.service

# Edit the unit file and reload in one step
sudo systemctl edit --full myapp.service

Fehlerbehebung bei häufigen Problemen

Service kann nicht gestartet werden: „No such file or directory”

Dies bedeutet normalerweise, dass ExecStart auf eine nicht vorhandene Binärdatei verweist oder WorkingDirectory nicht vorhanden ist. Überprüfen Sie beide Pfade:

which myapp
ls -l /opt/myapp

Service startet, beendet sich aber sofort

Überprüfen Sie das Journal auf die eigene Fehlerausgabe der Anwendung:

journalctl -u myapp.service -n 100 --no-pager

Überprüfen Sie auch, dass Type=simple für Ihre Anwendung korrekt ist. Wenn Ihre Binärdatei sich selbst in den Hintergrund verzweigt, verwenden Sie stattdessen Type=forking.

„Permission denied”-Fehler

Der Service-Benutzer hat keinen Zugriff auf eine erforderliche Datei oder ein erforderliches Verzeichnis. Verwenden Sie ls -l zur Überprüfung der Berechtigungen und sudo -u myuser zum interaktiven Testen des Zugriffs.

Port wird bereits verwendet

Ein anderer Prozess ist an den Port gebunden, den Ihre Anwendung benötigt. Identifizieren Sie ihn mit:

sudo ss -tlnp | grep :<port>

Service startet in einer Schleife neu

Wenn Restart=on-failure schnelle Neustartschleifen verursacht, wird systemd die Neustarts schließlich drosseln. Überprüfen Sie StartLimitIntervalSec und StartLimitBurst im Abschnitt [Unit], um dieses Verhalten zu optimieren, und untersuchen Sie immer die Grundursache im Journal.

Advanced systemd Patterns für Produktionsserver

Umgebungsvariablen und Umgebungsdateien

Hardcodieren Sie niemals Geheimnisse in Unit-Dateien. Verwenden Sie stattdessen eine Umgebungsdatei:

[Service]
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/myapp

Erstellen Sie /etc/myapp/myapp.env mit chmod 600 und chown root:myuser, um den Zugriff einzuschränken:

DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=supersecretkey

Service-Abhängigkeiten und Reihenfolge

Wenn Ihre Anwendung von einem Datenbankdienst abhängt (z. B. PostgreSQL oder MySQL), deklarieren Sie diese Abhängigkeit explizit:

[Unit]
After=network-online.target postgresql.service
Requires=postgresql.service

Requires ist eine harte Abhängigkeit — wenn PostgreSQL nicht startet, versucht systemd auch nicht, Ihren Service zu starten.

Watchdog-Integration

Aktivieren Sie für unternehmenskritische Services den integrierten Watchdog von systemd, um hängende Prozesse zu erkennen:

[Service]
WatchdogSec=30s
Restart=on-watchdog

Ihre Anwendung muss sd_notify(0, "WATCHDOG=1") regelmäßig aufrufen, um den Watchdog-Timer zurückzusetzen. Wenn dies nicht innerhalb von WatchdogSec geschieht, beendet systemd den Service und startet ihn neu.

Die richtige Hosting-Umgebung wählen

Die in diesem Leitfaden beschriebenen systemd-Konfigurationsmuster gelten gleichermaßen für alle Linux-Servertypen, aber Ihre Wahl der Hosting-Infrastruktur beeinflusst, wie viel Kontrolle Sie über das Init-System und die Service-Verwaltung haben.

  • VPS Hosting — Vollständiger Root-Zugriff, vollständige systemd-Kontrolle, ideal für benutzerdefinierte Anwendungsbereitstellungen. AlexHost VPS-Pläne laufen auf KVM-Virtualisierung und bieten Ihnen eine echte isolierte Kernel-Umgebung.
  • Dedicated Server — Maximale Leistung und Isolation für ressourcenintensive Services. Vollständiger Hardwarezugriff ohne störende Nachbarn.
  • VPS mit cPanel — Kombiniert Root-Level-systemd-Zugriff mit einem grafischen Kontrollpanel für Teams, die sowohl Systemservices als auch Web-Hosting von einer einzigen Schnittstelle aus verwalten.
  • Shared Web Hosting — Geeignet für Standard-Webanwendungen, die keine benutzerdefinierten Systemservices erfordern. Kein Root-Zugriff, aber null Server-Verwaltungsaufwand.

Wenn Sie einen benutzerdefinierten Daemon, Microservice oder eine Anwendung bereitstellen, die nach Neustarts automatisch verfügbar sein muss, ist ein VPS oder Dedicated Server mit vollständigem Root-Zugriff die richtige Wahl.

Schnellreferenz: Vollständige systemd-Service-Checkliste

Bevor Sie Ihren Service als produktionsbereit betrachten, überprüfen Sie jeden Punkt auf dieser Checkliste:

  • [ ] Unit-Datei gespeichert in /etc/systemd/system/myapp.service
  • [ ] ExecStart verwendet einen absoluten Pfad zu einer gültigen, ausführbaren Binärdatei
  • [ ] WorkingDirectory existiert und wird vom Service-Benutzer besessen
  • [ ] Service läuft als dediziertes Nicht-Root-Systemkonto
  • [ ] sudo systemctl daemon-reload nach jeder Unit-Datei-Änderung ausgeführt
  • [ ] sudo systemctl enable myapp.service bestätigt, dass der Symlink erstellt wurde
  • [ ] sudo systemctl status myapp.service zeigt active (running)
  • [ ] journalctl -u myapp.service zeigt keine Fehler
  • [ ] Server neu gestartet und Service nach dem Booten bestätigt laufend
  • [ ] Sicherheitshärtungs-Direktiven (NoNewPrivileges, ProtectSystem, PrivateTmp) angewendet

Fazit

systemd ist die definitive Service-Management-Schicht für moderne Linux-Server. Durch das Erstellen einer gut strukturierten .service Unit-Datei erhalten Sie automatisches Starten beim Boot, intelligente Neustartrichtlinien, zentralisierte Protokollierung und granulare Sicherheitskontrollen — alles ohne eine einzige Zeile Shell-Skript zu schreiben.

Der Prozess ist unkompliziert: Bereiten Sie ein dediziertes Arbeitsverzeichnis und einen Systembenutzer vor, schreiben Sie die Unit-Datei mit den korrekten [Unit], [Service] und [Install] Abschnitten, laden Sie den systemd-Daemon neu, aktivieren und starten Sie den Service, überprüfen Sie dann mit systemctl status und journalctl. Wenden Sie die oben besprochenen Sicherheitshärtungsrichtlinien an, und Ihr Service wird sowohl robust als auch angemessen vom Rest des Systems isoliert sein.

Egal ob Sie eine Node.js API, einen Python Worker, eine Go Binary oder eine andere benutzerdefinierte Anwendung auf einem AlexHost VPS Hosting oder Dedicated Servers Plan bereitstellen, dieser systemd-Workflow stellt sicher, dass Ihr Service immer läuft, wenn Ihre Benutzer ihn benötigen — selbst nach einem unerwarteten Neustart.