Agenda um reinício do servidor Minecraft
Um servidor Minecraft não precisa de reinícios como se costuma pensar, mas beneficia deles mesmo assim. Fragmentos de memória ao longo de tempos longos, dados de chunk acumulam-se de formas que o coletor de lixo trata cada vez menos graciosamente, e plugins com vazamentos são comuns o suficiente para que um reinício diário seja mais barato do que encontrar qual é o culpado.
Quando deve reiniciar?
Use {{minutes}} onde o número da contagem regressiva deve ir.
O que acontece, na ordem
- A tarefa começaAvisar
say O servidor vai reiniciar em 15 min - 10 min antesAvisar
say O servidor vai reiniciar em 10 min - 5 min antesAvisar
say O servidor vai reiniciar em 5 min - 1 min antesAvisar
say O servidor vai reiniciar em 1 min - Hora do reinícioGuardar
save-all - Hora do reinícioParar
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.
A linha do crontab
Deslocado 15 minutos mais cedo do que a hora escolhida, para que o reinício caia nele em vez de 15 minutos depois.
45 3 * * * /opt/restart-minecraft.sh
O script que executa
Guardar como /opt/restart-minecraft.sh e torná-lo executável. Assume que rcon-cli está no caminho e lê a senha do ambiente em vez de a incorporar.
#!/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 O servidor vai reiniciar em 15 min'
sleep 300
# 10 minute warning
send 'say O servidor vai reiniciar em 10 min'
sleep 300
# 5 minute warning
send 'say O servidor vai reiniciar em 5 min'
sleep 240
# 1 minute warning
send 'say O servidor vai reiniciar em 1 min'
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 || trueO Cron utiliza o fuso horário do servidor, não o teu. Verifica-o com timedatectl antes de presumir que 04:00 é 04:00 onde estás — um container em UTC e um admin na Europa estão duas horas separados no verão e uma no inverno.
A parte específica do Minecraft
Enviar save-all e deixá-lo terminar antes de parar. O encerramento faz a poupança por si próprio, então isto é redundante no caso normal — mas se o processo ficar pendente no caminho de saída, a diferença entre uma poupança redundante e nenhuma é a diferença entre não perder nada e perder tudo desde a última poupança automática. Se executar um proxy como Velocity ou BungeeCord, reinicie os servidores de backend em etapas em vez de juntos, para que os jogadores sejam movidos em vez de desconectados.