systemd meistern: Timer, Services und das Journal
systemd ist der Standard-Init-Prozess auf fast allen modernen Linux-Distributionen. Aber die meisten Administratoren nutzen nur einen Bruchteil seiner Möglichkeiten. Dieser Artikel zeigt, was systemd wirklich kann: Timer als cron-Ersatz, das Journal als zentrale Logging-Lösung, und Service-Management mit Abhängigkeiten.
Services verwalten
# Grundlegende Service-Befehle
systemctl start nginx # Starten
systemctl stop nginx # Stoppen
systemctl restart nginx # Neustart
systemctl reload nginx # Konfiguration neu laden (ohne Neustart)
systemctl status nginx # Status
systemctl enable nginx # Autostart beim Booten
systemctl disable nginx # Autostart entfernen
systemctl is-enabled nginx # Ist Autostart aktiv?
systemctl is-active nginx # Läuft der Service?
# Alle Services anzeigen
systemctl list-units --type=service # Aktive Services
systemctl list-units --type=service --all # Alle (auch inaktive)
systemctl list-unit-files --type=service # Installierte Services
systemctl list-units --state=failed # Fehlgeschlagene Services
enable vs. start — der häufigste Anfängerfehler
systemctl enablesorgt dafür, dass ein Service beim Booten startet. Es startet den Service nicht sofort.systemctl startstartet den Service jetzt, aber er startet beim nächsten Booten nicht automatisch.
Um beides zu tun: systemctl enable --now nginx (aktiviert Autostart und
startet sofort).
Eigene Service-Units schreiben
# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
Wants=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp --config /etc/myapp/config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
Environment=NODE_ENV=production
Environment=API_KEY_FILE=/etc/myapp/api-key
[Install]
WantedBy=multi-user.target
# Nach Änderungen:
systemctl daemon-reload # systemd neu laden
systemctl enable --now myapp # Aktivieren und starten
systemctl status myapp # Status prüfen
journalctl -u myapp -f # Logs folgen
Timer: Der cron-Ersatz
systemd-Timer sind ein moderner Ersatz für cron. Sie bieten Abhängigkeiten, Fallback-Verhalten und bessere Logs.
# /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup
[Service]
Type=oneshot
ExecStart=/opt/backup/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=daily
Persistent=true
AccuracySec=1m
[Install]
WantedBy=timers.target
# Timer aktivieren
systemctl enable --now backup.timer
systemctl list-timers # Alle Timer anzeigen
systemctl status backup.timer # Timer-Status
journalctl -u backup.service # Backup-Logs
Timer vs. cron: Die Vorteile
| Eigenschaft | cron | systemd-Timer |
|---|---|---|
| Abhängigkeiten | Nein | Ja (After=, Wants=) |
| Logs | Eigenes Logging | journalctl (zentral) |
| Fallback bei Fehler | Nein | Ja (Restart=, OnFailure=) |
| Anacron (versäumte Jobs nachholen) | Separate Software | Persistent=true |
| Präzision | Minutengenau | Sekundengenau (AccuracySec) |
| Resource Control | Nein | Ja (CPUQuota=, MemoryLimit=) |
Der Hauptvorteil: Timer sind in systemd integriert. Logs landen im Journal,
Abhängigkeiten werden respektiert, und versäumte Jobs (z. B. weil der Server
nachts aus war) werden mit Persistent=true nachgeholt.
Das Journal: zentrale Logging-Lösung
# Grundlegende Abfragen
journalctl # Alle Logs
journalctl -b # Nur aktueller Boot
journalctl -u nginx # Nur ein Service
journalctl --since "1 hour ago" # Zeitraum
journalctl --since today --until "12:00"
journalctl -p err # Nur Fehler (und schlimmer)
journalctl -p warning # Warnungen und Fehler
journalctl -f # Folgen (wie tail -f)
journalctl -n 50 # Letzte 50 Einträge
# Erweiterte Filter
journalctl -u nginx -u sshd # Mehrere Services
journalctl _PID=1234 # Nach PID
journalctl _UID=1000 # Nach User-ID
journalctl -g "error" # Volltext-Suche (grep)
journalctl --disk-usage # Journal-Größe
journalctl --vacuum-size=500M # Journal auf 500 MB begrenzen
journalctl --vacuum-time=7d # Logs älter als 7 Tage löschen
Resource Control mit cgroups
systemd nutzt cgroups (Control Groups) für Resource Control:
# CPU-Limit für einen Service
systemctl set-property myapp.service CPUQuota=50%
# Memory-Limit
systemctl set-property myapp.service MemoryLimit=512M
# In der Unit-Datei:
[Service]
CPUQuota=50%
MemoryLimit=512M
IOWeight=100
Ins Thema einsteigen
- LPIC-1 101-500 Deep Dive — Grundlagen inklusive systemd
- LPIC-2 202-450 Deep Dive — Systemadministration mit systemd
- LPIC-1 Befehls-Cheat-Sheet — Die wichtigsten Befehle kompakt
Bereit, zu üben? Starte mit den kostenlosen LPI Übungsfragen.