Reinicia tu servidor según un horario sin perder nada

Apagar un servidor de juegos con un temporizador es fácil y te cuesta datos. La forma correcta es advertir, advertir, guardar y luego apagar —y cada juego tiene sus propios verbos para eso. Elige el tuyo y toma el script.

Elige tu juego

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

¿Por qué importa el orden?

Un reinicio que omite el guardado depende de que el juego guarde al apagarse, y varios de los juegos aquí no lo hacen de forma fiable. ARK en particular es famoso por ello. Enviar un guardado explícito y esperar su retorno antes de enviar el apagado cuesta unos segundos y elimina toda una categoría de incidentes "perdimos un día". Enviar el apagado primero y esperar es cómo descubres en qué categoría está tu juego.

La línea de cron se ejecuta temprano a propósito

Si quieres que el servidor vuelva a estar en línea a las 04:00 y adviertes a los jugadores con quince minutos de antelación, el trabajo tiene que empezar a las 03:45. Casi todas las guías sobre este tema programan el trabajo a la hora objetivo y reinician quince minutos tarde en silencio. La expresión generada anteriormente está desplazada para ti, y se ajusta correctamente en la medianoche —un trabajo que comenzaría a las 23:50 para un reinicio a las 00:05 se escribe así en lugar de como una hora negativa.

Mantén la contraseña fuera del script

El script generado lee la contraseña de la consola desde el entorno en lugar de contenerla. No es una formalidad: un script con una contraseña en él se copia en un repositorio, se pega en un hilo de soporte y se incluye en una copia de seguridad que va a algún otro sitio. Pon el valor en un archivo solo legible por root o en tu unidad de servicio y manten el script lo suficientemente aburrido para compartir.

Juegos cubiertos

Esta lista es deliberadamente más corta que nuestro catálogo de juegos. Un script de reinicio construido sobre un comando de consola que no estuviéramos seguros habría fallado a las cuatro de la mañana y se habría llevado el guardado con él, por lo que un juego aparece aquí solo cuando sus comandos son conocidos en lugar de asumidos.

Soporte & Ayuda