Programa un reinicio de servidor Minecraft

Un servidor de Minecraft no necesita reiniciarse de la forma en que la gente asume, pero se beneficia de todos modos. La memoria se fragmenta con el tiempo, los datos de chunks se acumulan de formas que el recolector de basura maneja cada vez menos y los complementos con fugas son lo suficientemente comunes como para que un reinicio nocturno sea más barato que encontrar cuál es el culpable.

¿Cuándo debería reiniciarse?

Usa {{minutes}} donde debería ir el número de la cuenta atrás.

Lo que ocurre, en orden

  1. El trabajo comienzaAdvertirsay El servidor se reiniciará en 15 minutos
  2. 10 minutos antesAdvertirsay El servidor se reiniciará en 10 minutos
  3. 5 minutos antesAdvertirsay El servidor se reiniciará en 5 minutos
  4. 1 minutos antesAdvertirsay El servidor se reiniciará en 1 minutos
  5. Hora de reinicioGuardarsave-all
  6. Hora de reinicioDetenerstop

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 línea crontab

Desplazado 15 minutos antes de la hora elegida, para que el reinicio caiga en ella en lugar de 15 minutos después.

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

El script que ejecuta

Guárdalo como /opt/restart-minecraft.sh y hazlo ejecutable. Supone que rcon-cli está en la ruta y lee la contraseña del entorno en lugar de incrustarla.

#!/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 El servidor se reiniciará en 15 minutos'

sleep 300
# 10 minute warning
send 'say El servidor se reiniciará en 10 minutos'

sleep 300
# 5 minute warning
send 'say El servidor se reiniciará en 5 minutos'

sleep 240
# 1 minute warning
send 'say El servidor se reiniciará en 1 minutos'

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

El cron utiliza la zona horaria del servidor, no la tuya. Compruébala con timedatectl antes de asumir que las 04:00 son las 04:00 donde estás —un contenedor en UTC y un administrador en Europa tienen dos horas de diferencia en verano y una en invierno.

La parte específica de Minecraft

Envía save-all y déjalo terminar antes de detenerse. El cierre guarda solo, por lo que esto es redundante en el caso normal — pero si el proceso se cuelga en el camino, la diferencia entre una sauvegarde redundante y ninguna es la diferencia entre no perder nada y perder todo desde la última sauvegarde automática. Si ejecutas un proxy como Velocity o BungeeCord, reinicia los servidores traseros en una secuencia en lugar de juntos, para que los jugadores sean movidos en lugar de desconectados.

Soporte & Ayuda