Skip to content
rodolfo.gg
Go back

Leitfaden zur Verwaltung von Diensten mit systemd.

CC BY-NC-ND 4.0
Rodolfo González González

Leitfaden zur Verwaltung von Diensten mit systemd.

Einführung

Vor langer, langer Zeit begann ich damit, einen Solaris-Server einige Monate lang zu verwalten. Von dort wechselte ich zu Slackware, weil das das war, was es gab. Und dann zu Red Hat. Damals wurde der Lebenszyklus von Diensten problemlos mit SysVinit verwaltet. Irgendwann auf dem Weg hatte jedoch jemand die Idee, die Dinge zu verkomplizieren.

Dann kam systemd.

Und da Ubuntu, Debian und die meisten abgeleiteten Distributionen dieses System verwenden, bleibt nichts anderes übrig, als ein wenig darüber zu lernen.


Inhaltsverzeichnis

Inhaltsverzeichnis

1. Einführung: Was ist systemd und was verwaltet es

systemd ist das Init-System und der Dienstmanager, der in vielen modernen Linux-Distributionen vorherrschend ist. Sein Hauptprozess läuft typischerweise als PID 1 und ist verantwortlich für das Starten des Systems, die Verwaltung von Diensten, das Einbinden von Dateisystemen, das Starten von Sockets, das Planen von Aufgaben, die Verwaltung von Sitzungen, die Erfassung von Protokollen über journald und die Koordinierung von Abhängigkeiten zwischen Systemkomponenten.

In der täglichen Verwaltung ist der zentrale Befehl systemctl. Mit ihm werden systemd-Einheiten abgefragt, gestartet, gestoppt, aktiviert, deaktiviert, neu gestartet, neu geladen, maskiert und verwaltet.

Ein „Dienst” in systemd entspricht typischerweise einer Einheit mit der Erweiterung .service, zum Beispiel:

systemd verwaltet jedoch nicht nur Dienste. Es verwaltet verschiedene Typen von Einheiten: Dienste, Sockets, Timer, Ziele, Einhängepunkte, Autoeinhängepunkte, Pfade, Scheiben, Bereiche, Geräte und Auslagerungsbereiche.

Einfaches Beispiel zur Überprüfung des Status eines Dienstes:

Terminal window
systemctl status ssh.service

Befehlserklärung:

Alternatives Beispiel:

Terminal window
systemctl status ssh

Dieser Befehl löst ssh normalerweise zu ssh.service auf, solange keine Mehrdeutigkeit mit einer anderen Einheit gleichen Namens und unterschiedlicher Erweiterung besteht.


2. Grundlegende Konzepte: Einheiten, Dienste und Ziele

2.1 Einheit (Unit)

Eine Einheit ist ein von systemd verwaltetes Objekt. Jede Einheit wird durch eine Konfigurationsdatei definiert, die als Unit-Datei bezeichnet wird. Der Name der Einheit gibt ihren Typ durch die Erweiterung an.

Beispiele:

nginx.service
ssh.socket
apt-daily.timer
multi-user.target
home.mount

2.2 Dienst (Service)

Eine .service-Einheit beschreibt, wie ein Prozess oder eine Gruppe von Prozessen gestartet, gestoppt, neu geladen und überwacht wird.

Beispiel einer minimalen Service-Datei:

[Unit]
Description=Beispieldienst
After=network.target
[Service]
ExecStart=/usr/local/bin/mein-dienst
Restart=on-failure
[Install]
WantedBy=multi-user.target

Abschnittserklärung:

2.3 Ziel (Target)

Ein Ziel ist eine Einheit, die andere Einheiten zusammenfasst. Es ist näherungsweise mit den alten SysVinit-Runleveln vergleichbar.

Häufige Ziele:

Standard-Ziel anzeigen:

Terminal window
systemctl get-default

Erklärung:

Standard-Ziel festlegen:

Terminal window
sudo systemctl set-default multi-user.target

Erklärung:

Beispiel für einen Server ohne grafischen Desktop:

Terminal window
sudo systemctl set-default multi-user.target

Beispiel für eine Arbeitsstation mit grafischer Umgebung:

Terminal window
sudo systemctl set-default graphical.target

3. Grundlegende System- und Dienstinspektion

Vor der Installation, Änderung oder Entfernung von Diensten ist es nützlich zu wissen, wie man den Systemzustand untersucht.

3.1 Aktive Dienste auflisten

Terminal window
systemctl list-units --type=service --state=running

Erklärung:

Beispiel:

Terminal window
systemctl list-units --type=service --state=running

Nützlich, um zu überprüfen, welche Prozesse derzeit von systemd verwaltet werden.

3.2 Alle geladenen Dienste auflisten

Terminal window
systemctl list-units --type=service --all

Erklärung:

Beispiel:

Terminal window
systemctl list-units --type=service --all

3.3 Installierte Unit-Dateien auflisten

Terminal window
systemctl list-unit-files --type=service

Erklärung:

Die Ausgabe enthält typischerweise Zustände wie:

Beispiel:

Terminal window
systemctl list-unit-files --type=service | grep nginx

3.4 Detaillierten Status eines Dienstes anzeigen

Terminal window
systemctl status nginx.service

Erklärung:

Beispiel:

Terminal window
systemctl status nginx.service

Typische gekürzte Ausgabe:

● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since ...
Main PID: 1234 (nginx)
Tasks: 5
Memory: 12.3M

3.5 Interne Eigenschaften einer Einheit anzeigen

Terminal window
systemctl show nginx.service

Erklärung:

Beispiel mit Filterung einer Eigenschaft:

Terminal window
systemctl show nginx.service --property=MainPID

Erklärung:

Weiteres Beispiel:

Terminal window
systemctl show nginx.service --property=FragmentPath --property=DropInPaths

Erklärung:

3.6 Effektive Unit-Datei anzeigen

Terminal window
systemctl cat nginx.service

Erklärung:

Beispiel:

Terminal window
systemctl cat nginx.service

4. Dienstinstallation

Die Installation eines Dienstes kann zwei verschiedene Dinge bedeuten:

  1. Installation eines Systempaketes, das seinen eigenen systemd-Dienst enthält.
  2. Manuelles Erstellen und Installieren einer .service-Datei für eine eigene Anwendung.

Dieser Abschnitt behandelt die Installation über Paketmanager. Die manuelle Erstellung wird im nächsten Abschnitt behandelt.

4.1 Dienst auf Debian, Ubuntu und Derivaten installieren

Beispiel mit nginx:

Terminal window
sudo apt update
sudo apt install nginx

Erklärung des ersten Befehls:

Erklärung des zweiten Befehls:

Vollständiges Beispiel:

Terminal window
sudo apt update
sudo apt install nginx
systemctl status nginx.service

Nach der Installation eines Pakets ist es nützlich zu überprüfen, ob der Dienst aktiv oder aktiviert ist:

Terminal window
systemctl is-active nginx.service
systemctl is-enabled nginx.service

Erklärung:

4.2 Dienst auf Fedora, RHEL, CentOS Stream, Rocky Linux oder AlmaLinux installieren

Beispiel mit nginx:

Terminal window
sudo dnf install nginx

Erklärung:

Vollständiges Beispiel:

Terminal window
sudo dnf install nginx
systemctl status nginx.service

In vielen Distributionen der Red-Hat-Familie bedeutet die Installation eines Pakets nicht notwendigerweise, dass es gestartet oder aktiviert wird. Um es zu aktivieren und zu starten:

Terminal window
sudo systemctl enable --now nginx.service

Erklärung:

4.3 Dienst auf Arch Linux und Derivaten installieren

Beispiel mit nginx:

Terminal window
sudo pacman -Syu nginx

Erklärung:

Anschließend kann es aktiviert und gestartet werden:

Terminal window
sudo systemctl enable --now nginx.service

4.4 Installierte Dateien eines Pakets anzeigen

Auf Debian/Ubuntu:

Terminal window
dpkg -L nginx | grep systemd

Erklärung:

Beispiel:

Terminal window
dpkg -L nginx | grep '\.service$'

Erklärung:

Auf Fedora/RHEL:

Terminal window
rpm -ql nginx | grep '\.service$'

Erklärung:


5. Manuelle Erstellung eigener Dienste

Wenn eine Anwendung nicht als systemd-Dienst verpackt ist, kann eine Einheit manuell erstellt werden.

5.1 Beispiel einer eigenen Anwendung

Angenommen, es gibt eine ausführbare Datei unter:

/usr/local/bin/miapp

Und wir möchten sie als Dienst ausführen.

Zunächst wird empfohlen, einen dedizierten Systembenutzer zu erstellen:

Terminal window
sudo useradd --system --home /var/lib/miapp --create-home --shell /usr/sbin/nologin miapp

Erklärung:

In manchen Distributionen kann der Pfad von nologin unterschiedlich sein. Er kann überprüft werden mit:

Terminal window
command -v nologin

5.2 Verzeichnisse für die Anwendung erstellen

Terminal window
sudo mkdir -p /etc/miapp /var/lib/miapp /var/log/miapp
sudo chown -R miapp:miapp /var/lib/miapp /var/log/miapp
sudo chmod 0750 /var/lib/miapp /var/log/miapp

Erklärung:

5.3 Unit-Datei erstellen

Terminal window
sudo editor /etc/systemd/system/miapp.service

Vorgeschlagener Inhalt:

[Unit]
Description=Meine Beispielanwendung
Documentation=https://example.com/docs/miapp
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=miapp
Group=miapp
WorkingDirectory=/var/lib/miapp
EnvironmentFile=-/etc/miapp/miapp.env
ExecStart=/usr/local/bin/miapp --config /etc/miapp/config.yaml
Restart=on-failure
RestartSec=5s
TimeoutStartSec=30s
TimeoutStopSec=30s
KillSignal=SIGTERM
[Install]
WantedBy=multi-user.target

Erklärung von [Unit]:

Erklärung von [Service]:

Erklärung von [Install]:

5.4 systemd nach dem Erstellen oder Ändern einer Einheit neu laden

Terminal window
sudo systemctl daemon-reload

Erklärung:

Vollständiges Beispiel:

Terminal window
sudo editor /etc/systemd/system/miapp.service
sudo systemctl daemon-reload
sudo systemctl status miapp.service

5.5 Syntax einer Einheit überprüfen

Terminal window
systemd-analyze verify /etc/systemd/system/miapp.service

Erklärung:

Beispiel:

Terminal window
systemd-analyze verify /etc/systemd/system/miapp.service

Wenn der Befehl keine Fehler ausgibt, ist die Einheit wahrscheinlich syntaktisch gültig.

5.6 Eigenen Dienst aktivieren und starten

Terminal window
sudo systemctl enable --now miapp.service

Erklärung:

Überprüfen:

Terminal window
systemctl status miapp.service
journalctl -u miapp.service -n 50 --no-pager

Erklärung:


6. Dienste starten, stoppen, neustarten und neu laden

6.1 Dienst starten

Terminal window
sudo systemctl start nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl start nginx.service
systemctl status nginx.service

6.2 Dienst stoppen

Terminal window
sudo systemctl stop nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl stop nginx.service
systemctl is-active nginx.service

6.3 Dienst neustarten

Terminal window
sudo systemctl restart nginx.service

Erklärung:

Beispiel:

Terminal window
sudo nginx -t
sudo systemctl restart nginx.service

Erklärung:

6.4 Dienst neu laden ohne Neustart

Terminal window
sudo systemctl reload nginx.service

Erklärung:

Beispiel:

Terminal window
sudo nginx -t
sudo systemctl reload nginx.service

6.5 Neu laden wenn möglich, sonst neustarten

Terminal window
sudo systemctl reload-or-restart nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl reload-or-restart nginx.service

6.6 Nur neustarten wenn der Dienst bereits aktiv ist

Terminal window
sudo systemctl try-restart nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl try-restart nginx.service

6.7 Neu laden oder neustarten nur wenn aktiv

Terminal window
sudo systemctl reload-or-try-restart nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl reload-or-try-restart nginx.service

6.8 Prozesse eines Dienstes beenden

Terminal window
sudo systemctl kill nginx.service

Erklärung:

Beispiel mit SIGKILL:

Terminal window
sudo systemctl kill --signal=SIGKILL nginx.service

Erklärung:

Beispiel mit SIGHUP:

Terminal window
sudo systemctl kill --signal=SIGHUP nginx.service

Erklärung:


7. Dienste aktivieren, deaktivieren, maskieren und demaskieren

In systemd ist es wichtig, zwischen Starten und Aktivieren zu unterscheiden:

7.1 Dienst für automatischen Start aktivieren

Terminal window
sudo systemctl enable nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl enable nginx.service
systemctl is-enabled nginx.service

7.2 Aktivieren und starten in einem Schritt

Terminal window
sudo systemctl enable --now nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl enable --now nginx.service
systemctl status nginx.service

7.3 Dienst deaktivieren

Terminal window
sudo systemctl disable nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl disable nginx.service
systemctl is-enabled nginx.service
systemctl is-active nginx.service

7.4 Deaktivieren und stoppen in einem Ablauf

Es gibt keinen einzigen traditionellen Unterbefehl, der „disable —now” in allen historischen Versionen entspricht, obwohl viele moderne Versionen disable --now akzeptieren. Für maximale Kompatibilität kann es explizit gemacht werden:

Terminal window
sudo systemctl disable nginx.service
sudo systemctl stop nginx.service

Erklärung:

Beispiel mit --now wenn verfügbar:

Terminal window
sudo systemctl disable --now nginx.service

Erklärung:

7.5 Dienst reaktivieren

Terminal window
sudo systemctl reenable nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl reenable nginx.service

7.6 Dienst maskieren

Terminal window
sudo systemctl mask nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl mask nginx.service
systemctl status nginx.service

Konzeptionelle Ausgabe:

Loaded: masked (Reason: Unit nginx.service is masked.)

7.7 Maskieren und sofort stoppen

Terminal window
sudo systemctl mask --now nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl mask --now nginx.service

7.8 Dienst demaskieren

Terminal window
sudo systemctl unmask nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl unmask nginx.service
sudo systemctl enable --now nginx.service

7.9 Prüfen ob ein Dienst aktiv oder aktiviert ist

Terminal window
systemctl is-active nginx.service
systemctl is-enabled nginx.service

Erklärung:

Beispiel in einem Skript:

Terminal window
if systemctl is-active --quiet nginx.service; then
echo "Nginx ist aktiv"
else
echo "Nginx ist nicht aktiv"
fi

Erklärung:


8. Dienstkonfiguration mit Unit-Dateien und Drop-ins

8.1 Paketdateien nicht direkt bearbeiten

Von Paketen installierte Dienste haben ihre Einheiten normalerweise unter Pfaden wie:

/usr/lib/systemd/system/
/lib/systemd/system/

Je nach Distribution kann der eine oder andere der Hauptpfad sein. Es ist nicht ratsam, diese Dateien direkt zu bearbeiten, da ein Paket-Update die Änderungen überschreiben kann.

Der empfohlene Ort für lokale Änderungen ist:

/etc/systemd/system/

8.2 Dienst mit einem Drop-in bearbeiten

Terminal window
sudo systemctl edit nginx.service

Erklärung:

Beispiel zum Hinzufügen eines automatischen Neustarts:

Terminal window
sudo systemctl edit nginx.service

Inhalt:

[Service]
Restart=on-failure
RestartSec=3s

Danach:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

Erklärung:

8.3 Vollständige Unit-Datei bearbeiten

Terminal window
sudo systemctl edit --full nginx.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl edit --full nginx.service
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

8.4 Unterschiede zwischen Originaldateien und Überschreibungen anzeigen

Terminal window
systemd-delta

Erklärung:

Beispiel:

Terminal window
systemd-delta --type=extended

Erklärung:

Weiteres Beispiel:

Terminal window
systemd-delta nginx.service

8.5 Überschreibungen einer Einheit zurücksetzen

Um ein mit systemctl edit erstelltes Drop-in zu entfernen:

Terminal window
sudo rm -rf /etc/systemd/system/nginx.service.d
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

Erklärung:

Wenn systemctl edit --full verwendet wurde, muss die vollständige Kopie gelöscht werden:

Terminal window
sudo rm -f /etc/systemd/system/nginx.service
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

Erklärung:

8.6 Listen in Drop-ins überschreiben

Einige systemd-Direktiven akzeptieren mehrere Werte. Um sie in einem Drop-in vollständig zu ersetzen, müssen sie zunächst geleert werden.

Beispiel mit ExecStart:

[Service]
ExecStart=
ExecStart=/usr/local/bin/miapp --modo produccion

Erklärung:

Vollständiges Beispiel:

Terminal window
sudo systemctl edit miapp.service

Inhalt:

[Service]
ExecStart=
ExecStart=/usr/local/bin/miapp --config /etc/miapp/prod.yaml

Anwenden:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

8.7 Automatische Neustarts konfigurieren

Drop-in:

[Service]
Restart=on-failure
RestartSec=10s
StartLimitIntervalSec=300
StartLimitBurst=5

Erklärung:

Befehle:

Terminal window
sudo systemctl edit miapp.service
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

8.8 Abhängigkeiten und Startreihenfolge konfigurieren

Beispiel:

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

Erklärung:

Drop-in-Beispiel:

Terminal window
sudo systemctl edit miapp.service

Inhalt:

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

Anwenden:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

9. Umgebungsvariablen, Benutzer, Berechtigungen und Arbeitsverzeichnisse

9.1 Inline-Umgebungsvariablen

[Service]
Environment="APP_ENV=production" "APP_PORT=8080"

Erklärung:

Beispiel:

Terminal window
sudo systemctl edit miapp.service

Inhalt:

[Service]
Environment="APP_ENV=production" "LOG_LEVEL=info"

Anwenden:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

9.2 Variablen aus einer EnvironmentFile

Datei:

Terminal window
sudo install -d -m 0750 -o root -g miapp /etc/miapp
sudo editor /etc/miapp/miapp.env

Dateiinhalt:

Terminal window
APP_ENV=production
APP_PORT=8080
LOG_LEVEL=info

Unit-Datei:

[Service]
EnvironmentFile=/etc/miapp/miapp.env

Erklärung:

[Service]
EnvironmentFile=-/etc/miapp/miapp.env

Vollständiges Beispiel:

Terminal window
sudo editor /etc/miapp/miapp.env
sudo systemctl restart miapp.service

Hinweis: Wenn sich nur der Inhalt von EnvironmentFile ändert, reicht in der Regel ein Neustart des Dienstes. Wenn die Unit-Datei geändert wird, um die EnvironmentFile=-Direktive hinzuzufügen oder zu entfernen, ist daemon-reload erforderlich.

9.3 Als dedizierter Benutzer ausführen

[Service]
User=miapp
Group=miapp

Erklärung:

Beispiel zur Benutzererstellung:

Terminal window
sudo useradd --system --home /var/lib/miapp --create-home --shell /usr/sbin/nologin miapp

9.4 Arbeitsverzeichnis konfigurieren

[Service]
WorkingDirectory=/var/lib/miapp

Erklärung:

Beispiel:

[Service]
WorkingDirectory=/opt/miapp
ExecStart=/opt/miapp/bin/miapp

9.5 Verzeichnisse automatisch mit systemd erstellen

systemd kann Runtime-, Status-, Cache- und Protokollverzeichnisse für einen Dienst erstellen.

Beispiel:

[Service]
User=miapp
Group=miapp
RuntimeDirectory=miapp
StateDirectory=miapp
CacheDirectory=miapp
LogsDirectory=miapp

Erklärung:

Verwendungsbeispiel:

[Service]
User=miapp
Group=miapp
StateDirectory=miapp
WorkingDirectory=/var/lib/miapp
ExecStart=/usr/local/bin/miapp

9.6 DynamicUser verwenden

[Service]
DynamicUser=yes
StateDirectory=miapp
ExecStart=/usr/local/bin/miapp

Erklärung:

Beispiel:

[Unit]
Description=Dienst mit dynamischem Benutzer
[Service]
DynamicUser=yes
StateDirectory=miapp
ExecStart=/usr/local/bin/miapp --data-dir /var/lib/miapp
[Install]
WantedBy=multi-user.target

10. Protokolle, Diagnose und Fehlerbehebung

10.1 Protokolle eines Dienstes anzeigen

Terminal window
journalctl -u nginx.service

Erklärung:

Beispiel:

Terminal window
journalctl -u nginx.service

10.2 Letzte Protokollzeilen anzeigen

Terminal window
journalctl -u nginx.service -n 100 --no-pager

Erklärung:

Beispiel:

Terminal window
journalctl -u nginx.service -n 100 --no-pager

10.3 Protokolle in Echtzeit verfolgen

Terminal window
journalctl -u nginx.service -f

Erklärung:

Beispiel:

Terminal window
journalctl -u miapp.service -f

10.4 Protokolle seit dem letzten Start anzeigen

Terminal window
journalctl -u nginx.service -b

Erklärung:

Beispiel:

Terminal window
journalctl -u nginx.service -b --no-pager

10.5 Protokolle eines früheren Starts anzeigen

Terminal window
journalctl --list-boots

Erklärung:

Danach:

Terminal window
journalctl -b -1 -u nginx.service

Erklärung:

10.6 Systemfehler anzeigen

Terminal window
journalctl -p err -b

Erklärung:

Beispiel:

Terminal window
journalctl -p warning..alert -b --no-pager

Erklärung:

10.7 Fehlgeschlagene Dienste diagnostizieren

Terminal window
systemctl --failed

Erklärung:

Beispiel:

Terminal window
systemctl --failed

Details einer fehlgeschlagenen Einheit anzeigen:

Terminal window
systemctl status miapp.service
journalctl -u miapp.service -b -n 200 --no-pager

10.8 Fehlerstatus zurücksetzen

Terminal window
sudo systemctl reset-failed miapp.service

Erklärung:

Beispiel:

Terminal window
sudo systemctl reset-failed miapp.service
systemctl status miapp.service

Alle aufgezeichneten Fehler zurücksetzen:

Terminal window
sudo systemctl reset-failed

10.9 Startzeiten überprüfen

Terminal window
systemd-analyze

Erklärung:

Beispiel:

Terminal window
systemd-analyze blame

Erklärung:

Beispiel mit kritischem Pfad:

Terminal window
systemd-analyze critical-chain

Erklärung:

10.10 Abhängigkeitsbaum anzeigen

Terminal window
systemctl list-dependencies nginx.service

Erklärung:

Umgekehrtes Beispiel:

Terminal window
systemctl list-dependencies --reverse nginx.service

Erklärung:


11. Dienste deinstallieren, entfernen und bereinigen

Dieser Abschnitt unterscheidet mehrere Operationen, die oft verwechselt werden.

11.1 Vor der Deinstallation stoppen

Terminal window
sudo systemctl stop nginx.service

Erklärung:

11.2 Vor der Deinstallation deaktivieren

Terminal window
sudo systemctl disable nginx.service

Erklärung:

Kombiniertes Beispiel:

Terminal window
sudo systemctl disable --now nginx.service

Erklärung:

11.3 Paket auf Debian/Ubuntu deinstallieren

Paket entfernen und Konfiguration behalten:

Terminal window
sudo apt remove nginx

Erklärung:

Paket entfernen und vom Paket verwaltete Konfiguration bereinigen:

Terminal window
sudo apt purge nginx

Erklärung:

Nicht verwendete Abhängigkeiten entfernen:

Terminal window
sudo apt autoremove

Erklärung:

Vollständiges Beispiel:

Terminal window
sudo systemctl disable --now nginx.service
sudo apt purge nginx
sudo apt autoremove

11.4 Paket auf Fedora/RHEL deinstallieren

Terminal window
sudo dnf remove nginx

Erklärung:

Beispiel:

Terminal window
sudo systemctl disable --now nginx.service
sudo dnf remove nginx

11.5 Paket auf Arch Linux deinstallieren

Terminal window
sudo pacman -R nginx

Erklärung:

Paket und als Abhängigkeiten installierte nicht verwendete Abhängigkeiten entfernen:

Terminal window
sudo pacman -Rs nginx

Erklärung:

Beispiel:

Terminal window
sudo systemctl disable --now nginx.service
sudo pacman -Rs nginx

11.6 Einen manuellen Dienst aus /etc/systemd/system entfernen

Angenommen, er wurde manuell erstellt:

/etc/systemd/system/miapp.service

Empfohlener Prozess:

Terminal window
sudo systemctl disable --now miapp.service
sudo rm -f /etc/systemd/system/miapp.service
sudo systemctl daemon-reload
sudo systemctl reset-failed miapp.service

Erklärung:

Wenn der Dienst Drop-ins hatte:

Terminal window
sudo rm -rf /etc/systemd/system/miapp.service.d
sudo systemctl daemon-reload

Erklärung:

11.7 Daten, Protokolle und Konfiguration einer eigenen Anwendung entfernen

Nach dem Entfernen der Unit-Datei, wenn die Anwendung vollständig entfernt werden soll:

Terminal window
sudo rm -rf /etc/miapp /var/lib/miapp /var/log/miapp /var/cache/miapp

Erklärung:

Sichereres Beispiel, zuerst auflisten:

Terminal window
sudo find /etc/miapp /var/lib/miapp /var/log/miapp /var/cache/miapp -maxdepth 2 -print

Dann, wenn die Pfade bestätigt sind:

Terminal window
sudo rm -rf /etc/miapp /var/lib/miapp /var/log/miapp /var/cache/miapp

11.8 Dienst-Benutzer und -Gruppe entfernen

Terminal window
sudo userdel miapp

Erklärung:

Wenn auch das Home-Verzeichnis gelöscht werden soll, je nach Art der Erstellung:

Terminal window
sudo userdel --remove miapp

Erklärung:

Hinweis: Wenn das Home-Verzeichnis geteilt wurde, notwendige Daten enthält oder sich in einem sensiblen Pfad befindet, ist es ratsam, zuerst manuell zu überprüfen.

11.9 Verwaiste oder nicht gefundene Einheiten bereinigen

Nach dem manuellen Entfernen von Diensten:

Terminal window
sudo systemctl daemon-reload
systemctl list-units --type=service --all | grep miapp

Wenn sie als fehlgeschlagen erscheint:

Terminal window
sudo systemctl reset-failed miapp.service

Wenn sie als maskiert erscheint:

Terminal window
sudo systemctl unmask miapp.service
sudo systemctl daemon-reload

11.10 Einen manuell maskierten Dienst entfernen

Wenn ein Symlink wie dieser existiert:

/etc/systemd/system/miapp.service -> /dev/null

Er kann demaskiert werden:

Terminal window
sudo systemctl unmask miapp.service

Oder manuell überprüfen:

Terminal window
ls -l /etc/systemd/system/miapp.service

Wenn bestätigt wird, dass es ein Symlink zu /dev/null ist:

Terminal window
sudo rm -f /etc/systemd/system/miapp.service
sudo systemctl daemon-reload

12. Benutzerdienste: systemd —user

systemd kann auch Dienste pro Benutzer ohne Root-Rechte verwalten. Diese Dienste gehören zur Benutzersitzung und werden normalerweise konfiguriert unter:

~/.config/systemd/user/

12.1 Benutzerdienst erstellen

Terminal window
mkdir -p ~/.config/systemd/user
editor ~/.config/systemd/user/mi-tarea.service

Inhalt:

[Unit]
Description=Beispiel-Benutzerdienst
[Service]
ExecStart=/home/usuario/bin/mi-tarea
Restart=on-failure
[Install]
WantedBy=default.target

Erklärung:

12.2 Benutzereinheiten neu laden

Terminal window
systemctl --user daemon-reload

Erklärung:

12.3 Benutzerdienst aktivieren und starten

Terminal window
systemctl --user enable --now mi-tarea.service

Erklärung:

12.4 Benutzerprotokolle anzeigen

Terminal window
journalctl --user -u mi-tarea.service

Erklärung:

12.5 Benutzerdienste nach Abmeldung weiter laufen lassen

Terminal window
loginctl enable-linger usuario

Erklärung:

Beispiel:

Terminal window
sudo loginctl enable-linger deploy

Nützlich für Benutzerdienste, die von einem Deployment-Konto ausgeführt werden.

Linger deaktivieren:

Terminal window
sudo loginctl disable-linger deploy

13. Timer: praktischer Ersatz für cron bei periodischen Diensten

systemd-Timer ermöglichen die geplante Ausführung von Diensten.

13.1 Dienst erstellen, der durch einen Timer ausführbar ist

Datei:

Terminal window
sudo editor /etc/systemd/system/backup-miapp.service

Inhalt:

[Unit]
Description=MiApp-Sicherung
[Service]
Type=oneshot
User=miapp
Group=miapp
ExecStart=/usr/local/bin/backup-miapp

Erklärung:

13.2 Timer erstellen

Datei:

Terminal window
sudo editor /etc/systemd/system/backup-miapp.timer

Inhalt:

[Unit]
Description=Führt MiApp-Sicherung täglich aus
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
Unit=backup-miapp.service
[Install]
WantedBy=timers.target

Erklärung:

13.3 Timer aktivieren und starten

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now backup-miapp.timer

Erklärung:

13.4 Timer auflisten

Terminal window
systemctl list-timers --all

Erklärung:

Beispiel:

Terminal window
systemctl list-timers --all | grep backup-miapp

13.5 Timer-Dienst manuell ausführen

Terminal window
sudo systemctl start backup-miapp.service

Erklärung:


14. Sicherheit und Dienst-Hardening

systemd ermöglicht die Anwendung von Isolierungsmaßnahmen ohne Änderung der Anwendung.

14.1 Dateisystem schützen

Drop-in-Beispiel:

[Service]
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/miapp /var/log/miapp

Erklärung:

Anwenden:

Terminal window
sudo systemctl edit miapp.service
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

14.2 Rechte einschränken

[Service]
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true

Erklärung:

14.3 Linux-Fähigkeiten einschränken

[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

Erklärung:

Beispiel für eine Anwendung, die auf Port 80 lauscht:

[Service]
User=miapp
Group=miapp
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/local/bin/miapp --listen :80

14.4 Sicherheit einer Einheit analysieren

Terminal window
systemd-analyze security miapp.service

Erklärung:

Beispiel:

Terminal window
systemd-analyze security nginx.service

14.5 Sinnvolles Hardening eines eigenen Dienstes

Beispiel:

[Service]
User=miapp
Group=miapp
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/var/lib/miapp /var/log/miapp
Restart=on-failure

Erklärung:


15. Operative Best Practices

15.1 Klare Namen verwenden

Für eigene Dienste beschreibende Namen verwenden:

miapp-api.service
miapp-worker.service
miapp-scheduler.service

Dies erleichtert Protokollierung, Überwachung und Administration.

15.2 Dedizierte Benutzer verwenden

Dienste nicht als root ausführen, außer wenn unbedingt notwendig. Verwenden:

[Service]
User=miapp
Group=miapp

15.3 Konfiguration, Daten und Binärdateien trennen

Gängige Konvention:

/usr/local/bin/miapp # manuell installierte Binärdatei
/etc/miapp/ # Konfiguration
/var/lib/miapp/ # persistente Daten
/var/log/miapp/ # eigene Protokolle, falls zutreffend
/run/miapp/ # temporäre Runtime-Dateien

15.4 Vor dem Neustart validieren

Beispiel mit Nginx:

Terminal window
sudo nginx -t && sudo systemctl reload nginx.service

Erklärung:

Beispiel mit einer eigenen Anwendung, die Validierung unterstützt:

Terminal window
/usr/local/bin/miapp --check-config /etc/miapp/config.yaml && sudo systemctl restart miapp.service

15.5 Drop-ins für lokale Änderungen verwenden

Bevorzugt:

Terminal window
sudo systemctl edit miapp.service

Vermeiden, außer wenn gerechtfertigt:

Terminal window
sudo editor /usr/lib/systemd/system/miapp.service

Grund: Dateien unter /usr/lib/systemd/system oder /lib/systemd/system gehören normalerweise zu Paketen und können durch Updates überschrieben werden.

15.6 Überschreibungen dokumentieren

Ein Drop-in kann Kommentare enthalten:

[Service]
# Automatischer Neustart zur Toleranz vorübergehender Netzwerkausfälle.
Restart=on-failure
RestartSec=5s

15.7 Protokolle nach jeder Änderung überprüfen

Terminal window
sudo systemctl restart miapp.service
systemctl status miapp.service
journalctl -u miapp.service -b -n 100 --no-pager

15.8 rm -rf ohne Pfadüberprüfung vermeiden

Vor dem Löschen von Daten:

Terminal window
sudo find /var/lib/miapp -maxdepth 2 -print

Dann, wenn bestätigt:

Terminal window
sudo rm -rf /var/lib/miapp

15.9 daemon-reload bei Bedarf verwenden

Sollte verwendet werden nach:

Befehl:

Terminal window
sudo systemctl daemon-reload

Normalerweise nicht notwendig nach der alleinigen Änderung einer mit EnvironmentFile= geladenen Datei, außer wenn die Unit-Datei selbst geändert wurde.

15.10 reload von daemon-reload unterscheiden

Terminal window
sudo systemctl reload nginx.service

Lädt die Nginx-Konfiguration neu.

Terminal window
sudo systemctl daemon-reload

Lädt die systemd-Konfiguration neu, d.h. die Unit-Dateien.

Dies sind unterschiedliche Operationen.


16. Wichtige Verzeichnisse und Dateien

16.1 System-Unit-Dateien

/etc/systemd/system/

Verwendung:

Beispiele:

/etc/systemd/system/miapp.service
/etc/systemd/system/nginx.service.d/override.conf
/etc/systemd/system/multi-user.target.wants/nginx.service

/usr/lib/systemd/system/

Verwendung:

Beispiele:

/usr/lib/systemd/system/sshd.service
/usr/lib/systemd/system/docker.service

/lib/systemd/system/

Verwendung:

Beispiele:

/lib/systemd/system/ssh.service
/lib/systemd/system/nginx.service

/run/systemd/system/

Verwendung:


16.2 Benutzer-Unit-Dateien

~/.config/systemd/user/

Verwendung:

Beispiel:

/home/usuario/.config/systemd/user/mi-tarea.service

/etc/systemd/user/

Verwendung:


/usr/lib/systemd/user/

Verwendung:


16.3 Allgemeine systemd-Konfiguration

/etc/systemd/system.conf

Verwendung:


/etc/systemd/user.conf

Verwendung:


/etc/systemd/journald.conf

Verwendung:


/etc/systemd/logind.conf

Verwendung:


16.4 Journal-Protokolle

/run/log/journal/

Verwendung:


/var/log/journal/

Verwendung:

Persistente Journal-Speicherung erstellen:

Terminal window
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald.service

Erklärung:


16.5 Anwendungskonfiguration

/etc/<dienst>/

Verwendung:

Beispiele:

/etc/nginx/
/etc/ssh/
/etc/postgresql/
/etc/miapp/

16.6 Persistente Daten

/var/lib/<dienst>/

Verwendung:

Beispiele:

/var/lib/postgresql/
/var/lib/mysql/
/var/lib/docker/
/var/lib/miapp/

16.7 Klassische dateibasierte Protokolle

/var/log/<dienst>/

Verwendung:

Beispiele:

/var/log/nginx/
/var/log/apache2/
/var/log/miapp/

16.8 Laufzeitdateien

/run/<dienst>/

Verwendung:

Beispiele:

/run/nginx.pid
/run/sshd.pid
/run/miapp/

16.9 tmpfiles.d

/etc/tmpfiles.d/
/usr/lib/tmpfiles.d/
/run/tmpfiles.d/

Verwendung:

Beispieldatei:

/etc/tmpfiles.d/miapp.conf

Inhalt:

d /run/miapp 0750 miapp miapp -
d /var/log/miapp 0750 miapp miapp -

Manuell anwenden:

Terminal window
sudo systemd-tmpfiles --create /etc/tmpfiles.d/miapp.conf

Erklärung:


16.10 sysusers.d

/etc/sysusers.d/
/usr/lib/sysusers.d/
/run/sysusers.d/

Verwendung:

Beispiel:

/etc/sysusers.d/miapp.conf

Inhalt:

u miapp - "Systembenutzer für MiApp" /var/lib/miapp /usr/sbin/nologin

Manuell anwenden:

Terminal window
sudo systemd-sysusers /etc/sysusers.d/miapp.conf

Erklärung:


16.11 Aktivierungsbezogene Pfade

Bei der Ausführung von:

Terminal window
sudo systemctl enable miapp.service

kann systemd Symlinks erstellen wie:

/etc/systemd/system/multi-user.target.wants/miapp.service -> /etc/systemd/system/miapp.service

Erklärung:


16.12 Häufige Umgebungsdateien

Es gibt keinen einzigen universellen Ort, aber diese sind üblich:

/etc/default/<dienst> # Debian/Ubuntu in manchen Paketen
/etc/sysconfig/<dienst> # RHEL/Fedora in manchen Paketen
/etc/<dienst>/<dienst>.env

Beispiele:

/etc/default/nginx
/etc/sysconfig/sshd
/etc/miapp/miapp.env

Diese Dateien betreffen den Dienst nur, wenn die Unit-Datei eine Direktive wie diese hat:

EnvironmentFile=/etc/miapp/miapp.env

Referenzquellen


Kurzreferenz: Spickzettel häufiger Befehle

Terminal window
# Status anzeigen
systemctl status servicio.service
# Jetzt starten
sudo systemctl start servicio.service
# Jetzt stoppen
sudo systemctl stop servicio.service
# Neustarten
sudo systemctl restart servicio.service
# Dienstkonfiguration neu laden
sudo systemctl reload servicio.service
# Beim Start aktivieren
sudo systemctl enable servicio.service
# Aktivieren und jetzt starten
sudo systemctl enable --now servicio.service
# Beim Start deaktivieren
sudo systemctl disable servicio.service
# Deaktivieren und jetzt stoppen
sudo systemctl disable --now servicio.service
# Maskieren um Start zu verhindern
sudo systemctl mask servicio.service
# Demaskieren
sudo systemctl unmask servicio.service
# Einheitendefinitionen neu laden
sudo systemctl daemon-reload
# Protokolle anzeigen
journalctl -u servicio.service
# Neueste Protokolle anzeigen
journalctl -u servicio.service -n 100 --no-pager
# Protokolle in Echtzeit verfolgen
journalctl -u servicio.service -f
# Fehlgeschlagene Einheiten anzeigen
systemctl --failed
# Fehlerstatus löschen
sudo systemctl reset-failed servicio.service
# Effektive Unit-Datei anzeigen
systemctl cat servicio.service
# Lokale Überschreibung erstellen
sudo systemctl edit servicio.service
# Einheit validieren
systemd-analyze verify /etc/systemd/system/servicio.service

Share this post on:

Previous Post
Wie man ein JPEG oder PNG in ICO in der Linux-CLI konvertiert
Next Post
Grafiken einfach einbinden: Mermaid.