Systemd ist das Standard-Init-System auf modernen Linux-Distributionen. Es startet und verwaltet alle Dienste. In diesem Artikel lernen Sie die wichtigsten systemctl-Befehle.

Was ist Systemd?

Systemd ist:

  • Init-System: Startet das System und alle Dienste
  • Service-Manager: Verwaltet Hintergrunddienste
  • Log-Manager: Zentrales Logging mit journald

Grundlegende systemctl-Befehle

Service starten/stoppen

systemctl start nginx      # Starten
systemctl stop nginx       # Stoppen
systemctl restart nginx    # Neustart
systemctl reload nginx     # Konfiguration neu laden (ohne Neustart)

Status prüfen

systemctl status nginx

Ausgabe:

● nginx.service - A high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
     Active: active (running) since Mon 2024-01-26 10:00:00 UTC
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 2340)
     Memory: 5.2M

Autostart aktivieren/deaktivieren

systemctl enable nginx     # Autostart an
systemctl disable nginx    # Autostart aus
systemctl is-enabled nginx # Prüfen

Kombiniert: Aktivieren und starten

systemctl enable --now nginx

Services auflisten

Alle laufenden Services

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

Alle Services (auch inaktive)

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

Fehlgeschlagene Services

systemctl --failed

Service-Status verstehen

| Status | Bedeutung | |--------|-----------| | active (running) | Läuft normal | | active (exited) | Einmalig gelaufen, beendet | | inactive (dead) | Nicht gestartet | | failed | Fehlgeschlagen | | activating | Startet gerade |

Unit-Dateien

Speicherort

  • /lib/systemd/system/ - System-Units (vom Paketmanager)
  • /etc/systemd/system/ - Lokale/Angepasste Units
  • /run/systemd/system/ - Temporäre Units

Unit-Datei anzeigen

systemctl cat nginx

Unit-Datei bearbeiten

systemctl edit nginx        # Override erstellen
systemctl edit --full nginx # Vollständig bearbeiten

Eigene Service-Unit erstellen

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

[Unit]
Description=Meine Anwendung
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/meinapp
ExecStart=/usr/bin/node /var/www/meinapp/server.js
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Dann aktivieren:

systemctl daemon-reload     # Units neu einlesen
systemctl enable meinapp
systemctl start meinapp

Unit-Datei Erklärung

[Unit] Sektion

[Unit]
Description=Beschreibung des Dienstes
Documentation=https://example.com/docs
After=network.target mysql.service    # Starte nach diesen
Requires=mysql.service                # Braucht diese
Wants=redis.service                   # Möchte diese (optional)

[Service] Sektion

[Service]
Type=simple                    # simple, forking, oneshot, notify
User=www-data                  # Als welcher Benutzer?
Group=www-data
WorkingDirectory=/var/www/app
ExecStart=/usr/bin/app        # Startbefehl
ExecStop=/usr/bin/app stop    # Stoppbefehl (optional)
ExecReload=/bin/kill -HUP $MAINPID
Restart=always                # always, on-failure, no
RestartSec=5                  # Sekunden vor Neustart
Environment="NODE_ENV=production"
EnvironmentFile=/etc/app.env

[Install] Sektion

[Install]
WantedBy=multi-user.target    # Bei normalem Boot starten

Service-Typen

| Type | Beschreibung | |------|--------------| | simple | Prozess bleibt im Vordergrund (Standard) | | forking | Prozess forkt sich (klassische Daemons) | | oneshot | Einmalige Ausführung | | notify | Signalisiert Bereitschaft an Systemd |

Logs mit journalctl

Logs eines Services

journalctl -u nginx

Live-Logs folgen

journalctl -u nginx -f

Logs seit Boot

journalctl -u nginx -b

Logs der letzten Stunde

journalctl -u nginx --since "1 hour ago"

Logs eines bestimmten Zeitraums

journalctl -u nginx --since "2024-01-26 10:00" --until "2024-01-26 12:00"

System-Befehle

Neustart/Herunterfahren

systemctl reboot
systemctl poweroff

Targets (Runlevel)

systemctl get-default          # Standard-Target
systemctl set-default multi-user.target  # Ändern
systemctl isolate rescue.target          # In Rescue wechseln

Timer (Cron-Alternative)

Systemd-Timer als moderne Cron-Alternative:

Timer-Unit: `/etc/systemd/system/backup.timer`

[Unit]
Description=Tägliches Backup

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Service-Unit: `/etc/systemd/system/backup.service`

[Unit]
Description=Backup ausführen

[Service]
Type=oneshot
ExecStart=/root/backup.sh

Aktivieren:

systemctl enable --now backup.timer
systemctl list-timers

Troubleshooting

Service startet nicht

systemctl status dienst
journalctl -u dienst -n 50

Nach Konfigurationsänderung

systemctl daemon-reload
systemctl restart dienst

Abhängigkeiten anzeigen

systemctl list-dependencies nginx

Häufige Tasks

Nginx neustarten ohne Downtime

systemctl reload nginx

MySQL nach Konfigurationsänderung

systemctl restart mysql

Alle Dienste nach Boot prüfen

systemctl --failed

Fazit

systemctl ist der zentrale Befehl für Service-Verwaltung unter Linux. Die wichtigsten: start, stop, restart, status, enable. Mit journalctl prüfen Sie die Logs. Eigene Services erstellen Sie als Unit-Dateien in /etc/systemd/system/.