Reinicia o teu servidor numa agenda, sem perder nada
Matar um servidor de jogos numa contagem decrescente é fácil e custa-te dados. A forma correta é avisar, avisar, gravar, depois parar — e cada jogo escreve esses três verbos de forma diferente. Escolhe o teu e pega no script.
Escolhe o teu jogo
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.
Porque a ordem importa
Um reinício que salta a gravação depende do jogo gravar ao desligar, e vários dos jogos aqui não o fazem de forma confiável. ARK em particular é famoso por isso. Enviar uma gravação explícita e esperar que ela retorne antes de enviar o parar custa alguns segundos e remove uma categoria inteira de "perdemos um dia" de incidentes. Enviar o parar primeiro e esperar é como descobrimos em que categoria o nosso jogo se encontra.
A linha do cron é antecipada de propósito
Se queres que o servidor volte às 04:00 e quiseres avisar os jogadores durante quinze minutos primeiro, o trabalho tem de começar às 03:45. Quase todos os guias sobre este assunto agendam o trabalho na hora alvo e reiniciam quinze minutos mais tarde em silêncio. A expressão gerada acima é antecipada para ti, e ela envolve corretamente à meia-noite — um trabalho que começaria às 23:50 para um reinício às 00:05 é escrito como tal em vez de como uma hora negativa.
Manten o password fora do script
O script gerado lê o password da consola do ambiente em vez de o conter. Isso não é cerimónia: um script com um password nele é copiado para um repositório, colado numa discussão de suporte e incluído num backup que vai para outro sítio. Coloca o valor num ficheiro que apenas o root possa ler, ou na tua unidade de serviço, e mantém o script em si suficientemente simples para ser partilhado.
Jogos cobertos
Esta lista é deliberadamente mais curta do que o nosso catálogo de jogos. Um script de reinício construído num comando da consola que não tínhamos a certeza teria falhado às quatro da manhã e teria levado a gravação consigo, por isso um jogo aparece aqui apenas quando os seus comandos são conhecidos em vez de presumidos.