Redémarrez votre serveur selon un calendrier, sans rien perdre
Arrêter un serveur de jeu sur une minuterie est facile et coûte des données. La forme correcte est avertir, avertir, sauvegarder, puis arrêter — et chaque jeu énonce ces trois verbes différemment. Choisissez le vôtre et prenez le script.
Choisissez votre jeu
À 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
- Le travail commenceAvertir
say Redémarrage du serveur dans 15 minutes - 10 minutes avantAvertir
say Redémarrage du serveur dans 10 minutes - 5 minutes avantAvertir
say Redémarrage du serveur dans 5 minutes - 1 minutes avantAvertir
say Redémarrage du serveur dans 1 minutes - Heure de redémarrageEnregistrer
save-all - Heure de redémarrageArrêter
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.
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 || trueLe 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.
Pourquoi l'ordre est important
Un redémarrage qui saute la sauvegarde dépend du jeu qui sauvegarde lors de l'arrêt, et plusieurs des jeux ici ne le font pas de manière fiable. ARK en particulier est connu pour cela. Envoyer une sauvegarde explicite et attendre son retour avant d'envoyer l'arrêt coûte quelques secondes et élimine toute une catégorie d'incidents "nous avons perdu une journée". Envoyer l'arrêt en premier et espérer est le moyen de découvrir dans quelle catégorie se trouve votre jeu.
La ligne cron s'exécute tôt à dessein
Si vous voulez que le serveur soit de retour à 04:00 et que vous avertissez les joueurs pendant quinze minutes auparavant, le travail doit commencer à 03:45. Presque tous les guides sur ce sujet planifient le travail à l'heure cible et redémarrent silencieusement quinze minutes en retard. L'expression générée ci-dessus est décalée pour vous, et elle s'enroule correctement autour de minuit — un travail qui commencerait à 23:50 pour un redémarrage à 00:05 est écrit comme tel plutôt que sous forme d'heure négative.
Gardez le mot de passe hors du script
Le script généré lit le mot de passe de la console à partir de l'environnement plutôt que de le contenir. Ce n'est pas de la cérémonie : un script avec un mot de passe dedans est copié dans un référentiel, collé dans un fil d'assistance et inclus dans une sauvegarde qui va quelque part ailleurs. Mettez la valeur dans un fichier que seul root peut lire, ou dans votre unité de service, et gardez le script lui-même assez ennuyeux pour être partagé.
Jeux couverts
Cette liste est délibérément plus courte que notre catalogue de jeux. Un script de redémarrage construit sur une commande console que nous n'étions pas sûrs aurait échoué à quatre heures du matin et aurait pris la sauvegarde avec lui, donc un jeu apparaît ici uniquement lorsque ses commandes sont connues plutôt qu'assumées.