Plane den Restart deines Servers und verliere dabei nichts
Das Beenden eines Game-Servers nach einem Timer ist einfach und kostet dich Daten. Die richtige Reihenfolge ist Warnung, Warnung, Save und dann Stop – und jedes Spiel definiert diese drei Verben anders. Wähle deines und nimm das Skript.
Wähle dein Spiel
Wann sollte es neu starten?
Verwende {{minutes}}, wo die Countdown-Nummer hingehen sollte.
Was passiert, der Reihe nach
- Job startetWarnen
say Server restartet in 15 Minuten - 10 Minuten vorherWarnen
say Server restartet in 10 Minuten - 5 Minuten vorherWarnen
say Server restartet in 5 Minuten - 1 Minuten vorherWarnen
say Server restartet in 1 Minuten - NeustartzeitSpeichern
save-all - NeustartzeitStopp
stop
stop flushes the world to disk on its way out, so the explicit save-all is belt and braces rather than strictly required. Keep it anyway — it costs nothing and it means the save has already happened if the shutdown hangs.
Die crontab-Zeile
Verschoben um 15 Minuten früher als deine gewählte Zeit, damit der Neustart selbst auf ihr landet, anstatt 15 Minuten danach.
45 3 * * * /opt/restart-minecraft.sh
Das Skript, das es ausführt
Speichere als /opt/restart-minecraft.sh und mache es ausführbar. Es geht davon aus, dass rcon-cli auf dem Pfad ist und liest das Passwort aus der Umgebung anstatt es einzubetten.
#!/usr/bin/env bash
set -euo pipefail
# Scheduled restart for Minecraft.
# Generated by spawnly.net/tools/restart-scheduler
# The password stays out of this file. Put it in the environment, or in a
# file only root can read, and export it before this script runs.
RCON_HOST="${RCON_HOST:-127.0.0.1}"
RCON_PORT="${RCON_PORT:-25575}"
: "${RCON_PASSWORD:?set RCON_PASSWORD before running}"
send() {
rcon-cli --host "$RCON_HOST" --port "$RCON_PORT" --password "$RCON_PASSWORD" "$1"
}
# 15 minute warning
send 'say Server restartet in 15 Minuten'
sleep 300
# 10 minute warning
send 'say Server restartet in 10 Minuten'
sleep 300
# 5 minute warning
send 'say Server restartet in 5 Minuten'
sleep 240
# 1 minute warning
send 'say Server restartet in 1 Minuten'
sleep 60
# Flush the world to disk
send 'save-all'
sleep 10
# Shut down cleanly
send 'stop'
# Give the process time to finish writing before anything restarts it.
sleep 30
systemctl start minecraft 2>/dev/null || trueDer Cron verwendet die Zeitzone des Servers, nicht deine. Überprüfe sie mit timedatectl, bevor du davon ausgehst, dass 04:00 Uhr 04:00 Uhr bedeutet – ein Container in UTC und ein Admin in Europa sind im Sommer zwei Stunden und im Winter eine Stunde auseinander.
Warum die Reihenfolge wichtig ist
Ein Restart, der das Save überspringt, relies auf das Spiel, das beim Herunterfahren speichert, und einige der hier aufgeführten Spiele tun das nicht zuverlässig. ARK ist dabei besonders berüchtigt. Das Ausführen eines expliziten Save und das Warten auf die Rückkehr, bevor der Stopp gesendet wird, kostet ein paar Sekunden und entfernt eine gesamte Kategorie von "wir haben einen Tag verloren"-Incidenten. Das Senden des Stops zuerst und das Hoffen, ist wie man herausfindet, in welche Kategorie das Spiel fällt.
Die cron-Zeile läuft früh absichtlich
Wenn du den Server um 04:00 Uhr wieder hochfahren möchtest und die Spieler 15 Minuten vorher warnst, muss der Job um 03:45 Uhr starten. Fast jede Anleitung zu diesem Thema plant den Job zur Zielzeit und startet stillschweigend 15 Minuten zu spät. Der oben erzeugte Ausdruck ist für dich verschoben und wickelt sich korrekt über Mitternacht – ein Job, der um 23:50 Uhr für einen 00:05 Uhr-Restart starten würde, wird als solcher geschrieben und nicht als negativer Stundenwert.
Behalte das Passwort aus dem Skript heraus
Das erzeugte Skript liest das Konsolenpasswort aus der Umgebung statt es zu enthalten. Das ist kein Ceremony: Ein Skript mit einem Passwort darin wird in ein Repository kopiert, in einen Support-Thread eingefügt und in einer Backup-Datei gespeichert, die irgendwo hingeht. Setze den Wert in eine Datei, auf die nur root zugreifen kann, oder in deine Service-Einheit und halte das Skript selbst langweilig genug, um geteilt zu werden.
Abgedeckte Spiele
Diese Liste ist absichtlich kürzer als unser Spielkatalog. Ein auf einem Konsolenbefehl aufgebautes Restart-Skript, von dem wir nicht sicher waren, würde um vier Uhr morgens fehlschlagen und das Save mitnehmen, daher erscheint ein Spiel hier nur, wenn seine Befehle bekannt sind, nicht angenommen.