Skip to content

systemd Referenz

ElGregor edited this page Aug 15, 2026 · 1 revision

systemd-Referenz — Service, Timer und Watchdog

Home · Zurück: Skripte-Referenz

Das Repo betreibt den Server unter Linux als systemd-Service und hängt Backup und Update an systemd-Timer; der Crash-Watchdog läuft per Cron. Alle Unit-Dateien liegen in systemd/ im Repo und werden vor der Installation per sed-Templating auf die eigenen Werte gebracht.

Units im Überblick

Unit Typ Zweck
zomboid.service service (simple) Der Dedicated Server selbst
zomboid-backup.service service (oneshot) Führt backup.sh daily aus
zomboid-backup.timer timer Triggert das Backup täglich 04:00
zomboid-update.service service (oneshot) Führt update.sh aus
zomboid-update.timer timer Triggert das Update wöchentlich (templated)

Alle Direktiven und Zeitwerte: Repo-Default (1:1 aus den Unit-Dateien).

zomboid.service — der Server-Service

Komplette relevante Unit (1:1, Platzhalter noch unersetzt):

[Unit]
Description=Project Zomboid Dedicated Server (ProjectZomboiD)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=__PZ_USER__
EnvironmentFile=-__REPO__/.env
WorkingDirectory=__PZ_SERVER_DIR__
ExecStart=__PZ_SERVER_DIR__/start-server.sh -servername ${SERVER_NAME} -Xmx${RAM_XMX}
Restart=always
RestartSec=30
TimeoutStopSec=120
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Die Direktiven erklärt:

Direktive Bedeutung
After=/Wants=network-online.target Erst starten, wenn Netzwerk da ist
User=__PZ_USER__ Läuft als dedizierter Nutzer (aus .env: PZ_USER)
EnvironmentFile=-__REPO__/.env Liest .env ein; das führende - = Datei darf fehlen
WorkingDirectory Server-Installationsverzeichnis (PZ_SERVER_DIR)
ExecStart start-server.sh -servername ${SERVER_NAME} -Xmx${RAM_XMX} — Servername und Heap kommen direkt aus .env (Repo-Default)
Restart=always + RestartSec=30 Neustart nach Absturz, 30 s Verzögerung
TimeoutStopSec=120 Gibt dem Server bis zu 120 s für sauberes Stoppen
LimitNOFILE=65535 Erhöht das Datei-Handle-Limit — wichtig für viele Mods/Spieler
WantedBy=multi-user.target Autostart nach Boot, sobald enable gesetzt ist

Zu -Xmx: .env setzt RAM_XMX=12G als Default (Repo-Default); zur Heap-Dimensionierung siehe ENV-Variablen und Performance-Guide.

Installation (sed-Templating)

Der Ordner systemd/ enthält bewusst Platzhalter — __PZ_USER__, __REPO__, __PZ_SERVER_DIR__, __UPDATE_DAY__, __UPDATE_TIME__ — die vor dem Kopieren mit den Werten aus .env ersetzt werden (systemd/README.md). Der dokumentierte Weg (1:1 aus systemd/README.md):

export REPO=$(pwd)
sed -e "s|__PZ_USER__|$PZ_USER|" -e "s|__REPO__|$REPO|" \
    -e "s|__PZ_SERVER_DIR__|$PZ_SERVER_DIR|" systemd/zomboid.service | sudo tee /etc/systemd/system/zomboid.service
sudo systemctl daemon-reload
sudo systemctl enable --now zomboid zomboid-update.timer zomboid-backup.timer

Hinweis (ehrlich aus den Dateien ablesbar): Der sed-Aufruf im README behandelt nur zomboid.service; auch zomboid-backup.service, zomboid-update.service (beide __REPO__) und zomboid-update.timer (__UPDATE_DAY__/__UPDATE_TIME__) tragen Platzhalter und müssen analog ersetzt werden, bevor enable --now beide Timer aktiviert (Repo-Verhalten — sonst starten die Timer mit wörtlichen Platzhaltern).

Timer

zomboid-backup.timer — tägliches Backup

[Timer]
OnCalendar=*-*-* 04:00
Persistent=true
  • OnCalendar=*-*-* 04:00: täglich um 04:00 Uhr (Repo-Default)
  • Persistent=true: verpasste Läufe (Host war aus) werden beim nächsten Boot nachgeholt
  • Dazugehöriger oneshot-Service zomboid-backup.service: ExecStart=__REPO__/scripts/backup.sh daily (1:1) — Details Backup-und-Restore

zomboid-update.timer — wöchentliches Update

[Timer]
OnCalendar=__UPDATE_DAY__ __UPDATE_TIME__
Persistent=true
  • Beide Felder sind Platzhalter, gefüllt aus .env: UPDATE_DAY=Tue, UPDATE_TIME=03:00 (Repo-Default aus .env.example)
  • Dazugehöriger oneshot-Service zomboid-update.service: ExecStart=__REPO__/scripts/update.sh (1:1) — der komplette Zyklus inklusive Auto-Rollback läuft also auch automatisch, siehe Updates-und-Rollback
  • Ebenfalls Persistent=true (Repo-Default)

Watchdog per Cron

systemd prüft nur „läuft der Prozess". Der Crash-Watchdog obendrauf läuft per Cron, minütlich (Eintrag 1:1 aus systemd/README.md):

* * * * * /pfad/zum/repo/scripts/monitor.sh

monitor.sh (Details: Skripte-Referenz):

  1. systemctl is-active zomboid → aktiv: nichts tun
  2. Lockfile ${REPO_ROOT}/.planned-stop vorhanden → nichts tun (geplanter Stop, z. B. während Update/Wartung)
  3. Sonst: sudo systemctl restart zomboid, 45 s warten, Healthcheck, Discord-Alarm — bei Erfolg wie bei Misserfolg

.planned-stop verhindert den Fehl-Neustart: Legt man vor einem geplanten Stop touch .planned-stop im Repo-Root an, greift der Watchdog nicht ein, während der Server bewusst unten ist; danach Datei wieder löschen (docs/05-wartung.md).

Sauber stoppen

make stop              # = sudo systemctl stop zomboid (Makefile, 1:1)
sudo systemctl stop zomboid

systemd sendet SIGTERM an den Java-Prozess; TimeoutStopSec=120 gibt ihm bis zu 2 Minuten, sauber zu speichern und sich zu beenden (Repo-Default). Für Wartungsstopps vorher .planned-stop anlegen, damit der minütliche Watchdog den Server nicht sofort wieder hochzieht.

Community-Caveat (Community-Quelle: pzwiki-Diskussion): Der direkte Betrieb des PZ-Servers unter systemd ist community-seitig umstritten — im Fokus steht die SIGTERM-„Unclean shutdown"-Debatte (erzwungene Beendigung ohne sauberes /quit im Spiel). Dieses Repo entscheidet sich trotzdem für systemd (Repo-Default): Restart=always gibt Absturzsicherheit, und die Stop-Pfade laufen über die Skripte bzw. start-server.sh mit ausreichend Timeout. Wer maximale Vorsicht will, kann vor make stop per RCON /quit senden (Heuristik; RCON ist in .env aktivierbar — ankündigen via announce.sh ist im Repo bereits eingebaut).

Autostart, Timer prüfen, Logs

Autostart nach Reboot setzt systemctl enable (im Installationsweg oben enthalten). Prüfen:

systemctl is-enabled zomboid zomboid-backup.timer zomboid-update.timer

Timer-Status kontrollieren (nächste Termine, letzter Lauf):

systemctl list-timers zomboid-backup.timer zomboid-update.timer

Logs des Servers:

sudo journalctl -u zomboid -f          # Live (identisch zu: make logs)
sudo journalctl -u zomboid --since "5 min ago"
sudo journalctl -u zomboid-backup.service -n 50   # was der Backup-Runner tat

Der Healthcheck des Repos greift ebenfalls auf journalctl -u zomboid zu (letzte 5 Minuten, Muster OutOfMemory|Exception in thread|FATAL — Repo-Default) — Details Monitoring-und-Alerts und Troubleshooting.

Weiter: Wartung-und-Automatik (der Gesamt-Rhythmus) · Backup-und-Restore · Zurück: Skripte-Referenz

Clone this wiki locally