Plane den Restart deines Minecraft Servers

Ein Minecraft Server benötigt keinen Neustart, wie man annimmt, aber er profitiert trotzdem davon. Speicherfragmente sammeln sich im Laufe der Zeit an, Chunk-Daten auf eine Weise, die der Garbage Collector immer schlechter handhabt, und Plugins mit Lecks sind so häufig, dass ein täglicher Neustart günstiger ist als das Herausfinden, welches schuld ist.

Wann sollte es neu starten?

Verwende {{minutes}}, wo die Countdown-Nummer hingehen sollte.

Was passiert, der Reihe nach

  1. Job startetWarnensay Server restartet in 15 Minuten
  2. 10 Minuten vorherWarnensay Server restartet in 10 Minuten
  3. 5 Minuten vorherWarnensay Server restartet in 5 Minuten
  4. 1 Minuten vorherWarnensay Server restartet in 1 Minuten
  5. NeustartzeitSpeichernsave-all
  6. NeustartzeitStoppstop

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 || true

Der 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.

Der Teil, der spezifisch für Minecraft ist

Sende save-all und warte, bis es beendet ist, bevor du stoppst. Der Shutdown speichert normalerweise von allein, daher ist dies im Normalfall redundant – aber wenn der Prozess auf dem Weg nach draußen hängt, ist der Unterschied zwischen einem redundanten Speicher und keinem Speicher der Unterschied zwischen dem Verlust von nichts und dem Verlust von allem seit dem letzten Autospiel. Wenn du einen Proxy wie Velocity oder BungeeCord läufst, starte die Backend-Server gestaffelt statt zusammen, damit die Spieler umgezogen werden, anstatt getrennt zu werden.

Support & Hilfe