Planifiez un redémarrage de serveur Minecraft

Un serveur Minecraft n'a pas besoin d'être redémarré comme on le pense généralement, mais il en profite quand même. La fragmentation de la mémoire sur de longues durées, l'accumulation des données de chunks de manière de moins en moins gracieuse par le récupérateur de mémoire, et les plugins avec des fuites sont suffisamment courants pour qu'un redémarrage quotidien soit moins cher qu'essayer de trouver lequel est en faute.

À quel moment doit-il redémarrer ?

Utilisez {{minutes}} là où le nombre de compte à rebours doit être placé.

Ce qui se passe, dans l'ordre

  1. Le travail commenceAvertirsay Redémarrage du serveur dans 15 minutes
  2. 10 minutes avantAvertirsay Redémarrage du serveur dans 10 minutes
  3. 5 minutes avantAvertirsay Redémarrage du serveur dans 5 minutes
  4. 1 minutes avantAvertirsay Redémarrage du serveur dans 1 minutes
  5. Heure de redémarrageEnregistrersave-all
  6. Heure de redémarrageArrêterstop

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.

La ligne cron

Décalé de 15 minutes plus tôt que l'heure choisie, afin que le redémarrage lui-même tombe à cette heure plutôt qu'à 15 minutes après.

45 3 * * *  /opt/restart-minecraft.sh

Le script qu'il exécute

Enregistrer en tant que /opt/restart-minecraft.sh et le rendre exécutable. Il suppose que rcon-cli est sur le chemin et lit le mot de passe à partir de l'environnement plutôt que de l'intégrer.

#!/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 Redémarrage du serveur dans 15 minutes'

sleep 300
# 10 minute warning
send 'say Redémarrage du serveur dans 10 minutes'

sleep 300
# 5 minute warning
send 'say Redémarrage du serveur dans 5 minutes'

sleep 240
# 1 minute warning
send 'say Redémarrage du serveur dans 1 minutes'

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

Le cron utilise le fuseau horaire du serveur, pas le vôtre. Vérifiez-le avec timedatectl avant de supposer que 04:00 signifie 04:00 chez vous — un conteneur en UTC et un administrateur en Europe sont deux heures éloignés en été et une en hiver.

La partie spécifique à Minecraft

Envoyer un enregistrement général et le laisser terminer avant l'arrêt. L'arrêt enregistre de lui-même, donc cela est redondant dans le cas normal — mais si le processus est bloqué en cours de route, la différence entre un enregistrement redondant et aucun enregistrement est la différence entre ne rien perdre et tout perdre depuis le dernier enregistrement automatique. Si vous exécutez un proxy tel que Velocity ou BungeeCord, redémarrez les serveurs backend sur une durée plutôt que tous ensemble, afin que les joueurs soient déplacés plutôt que déconnectés.

Assistance & Aide