Eigenen systemd Service erstellen
# Beispiel: Node.js-App als Dienst
cat > /etc/systemd/system/meine-app.service << 'EOF'
[Unit]
Description=Meine Node.js Anwendung
Documentation=https://github.com/firma/meine-app
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/meine-app
ExecStart=/usr/bin/node /opt/meine-app/server.js
Restart=on-failure
RestartSec=5s
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=meine-app
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/opt/meine-app/.env
# Security-Härtung
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full
ProtectHome=yes
ReadWritePaths=/opt/meine-app/data /var/log/meine-app
[Install]
WantedBy=multi-user.target
EOF
# Dienst aktivieren
systemctl daemon-reload
systemctl enable --now meine-app
systemctl status meine-app
Dienst verwalten
# Start/Stop/Restart
systemctl start meine-app
systemctl stop meine-app
systemctl restart meine-app
systemctl reload meine-app # Konfiguration neu laden (ohne Neustart)
# Autostart an/aus
systemctl enable meine-app # Nach Reboot automatisch starten
systemctl disable meine-app # Nicht automatisch starten
# Abhängigkeiten anzeigen
systemctl list-dependencies meine-app
# Dienste anzeigen
systemctl list-units --type=service --state=running
journalctl – Logs lesen
# Aktuelle Logs
journalctl -u meine-app -f # Follow (live)
# Letzte 100 Einträge
journalctl -u meine-app -n 100
# Zeitraum
journalctl -u meine-app --since "1 hour ago"
journalctl -u meine-app --since "2025-06-10" --until "2025-06-11"
# Alle Fehler des letzten Boots
journalctl -b -p err
# Kernel-Nachrichten
journalctl -k --since "today"
# Log-Größe
journalctl --disk-usage
# Alte Logs löschen (älter als 30 Tage)
journalctl --vacuum-time=30d
systemd Timer (Cron-Ersatz)
# Service-Unit
cat > /etc/systemd/system/backup.service << 'EOF'
[Unit]
Description=Tägliches Backup
After=network.target
[Service]
Type=oneshot
User=backup
ExecStart=/opt/scripts/backup.sh
StandardOutput=journal
EOF
# Timer-Unit
cat > /etc/systemd/system/backup.timer << 'EOF'
[Unit]
Description=Tägliches Backup Timer
Requires=backup.service
[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now backup.timer
# Timer anzeigen
systemctl list-timers --all
Socket Activation
# Service nur starten wenn Verbindung eingeht
cat > /etc/systemd/system/mein-socket-service.socket << 'EOF'
[Unit]
Description=Mein Socket-Dienst
[Socket]
ListenStream=9000
[Install]
WantedBy=sockets.target
EOF
Service-Einheiten debuggen
# Warum startet ein Dienst nicht?
systemctl status meine-app --no-pager -l
journalctl -u meine-app --no-pager -n 50
# Service-Unit validieren
systemd-analyze verify /etc/systemd/system/meine-app.service
# Boot-Zeit analysieren
systemd-analyze blame | head -20
systemd-analyze critical-chain
FAQ
Was ist der Unterschied zwischen Restart=on-failure und Restart=always?
on-failure: Neustart nur bei Fehler-Exitcode (nicht bei SIGTERM/systemctl stop). always: immer neu starten auch nach normalem Beenden.
Fazit
systemd Service Units sind der moderne Standard für Linux-Daemon-Management. Timer ersetzen Cron zuverlässiger mit Logging und Fehlerbehandlung.
Linux-Administration für KMU in Heidelberg, Mannheim und der Rhein-Neckar-Region. Beratung anfragen.