Bonjour,
J'ai conscience que le titre est bien insuffisant, mais je dois dire que j'arrive à un point où je n'arrive plus à trouver le terme exact. Donc voici quelque explications :
J'utilise un raspberry pi 3 B+ sur lequel tourne le serveur. Pour conserver un maximum de ressources je n'utilise pas l'interface graphique de raspbian.
Afin de faciliter la gestion du serveur, j'ai décidé d'automatiser au maximum son fonctionnement en le liant intimement au système. Pour le dire autrement, je passe par les services de systemd pour démarrer ou sauvegarder mon serveur.
Pour démarrer mon serveur j'ai un fichier server.service qui lance un script run.sh (qui se trouve dans un répertoire de type /home/pi/Desktop/MinecraftServer/Server).
Mon fichier run.sh contien ces lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 [Unit] Description=Lance mon serveur Minecraft After=network.target [Service] Type=forking ExecStart=/usr/bin/screen -dmS pi /home/pi/Desktop/MinecraftServer/Server/run.sh ExecStop=/usr/bin/screen -p 0 -S pi -X eval 'stuff"save-all"\015' ExecStop=/usr/bin/screen -p 0 -S pi -X eval 'stuff "stop"\015' [Install] WantedBy=multi-user.target
Une fois que j'ai fait ça, je redoutais de perdre la map en cas de panne du raspberry, donc, j'ai mis en place un timer et un service dédié à la sauvegarde hebdomadaire du serveur (je fais une archive de l'ensemble du serveur et je l'envoie sur ma dropbox perso). J'ai donc un fichier serversave.timer et un serversave.service. Le fichier est donc enregistré dans un dossier de type /home/pi/Desktop/MinecraftServer/Save
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #!/bin/sh cd /home/pi/Desktop/MinecraftServer/TeraMineServer java -Xms512M -Xmx1024M -XX:+UseConcMarkSweepGC -jar ./spigot.jar nogui
Mais depuis peu je me suis dit que j'allais aller plus loin et proposer une mise à jour régulière du serveur (suivant les versions stables), donc je me suis inspiré des informations livrées sur le site délivrant le serveur que j'utilise (à savoir spigot). Du coup je me suis dit que j'allais intégrer cette mise à jour à ma session de sauvegarde hebdomadaire (suivant les conseils des développeurs du serveur). J'ai donc tenté une approche via un script updatespigot.sh dans un dossier de type /home/pi/Desktop/MinecraftServer/UpdateSpigot
J'ai donc un fichier servicesave.timer :
Un fichier serversave.service :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 [Unit] Description=Lance une sauvegarde du serveur minecraft tous les Jeudi [Timer] OnCalendar=Thu 03:00 [Install] WantedBy=timers.target
Et mon script de mise à jour updatespigot.sh :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 [Unit] Description=Sauvegarde du serveur minecraft [Service] Type=oneshot ExecStart=/bin/systemctl stop server.service ExecStart=/bin/bash -c 'tar -cvzf /home/pi/Desktop/MinecraftServer/Save/save-$$(date +%%Y%%m%%d-%%H%%M).tar.gz /home/pi/Desktop/MinecraftServer/Server' ExecStart=/home/pi/Desktop/MinecraftServer/UpdateSpigot/temp/updatespigot.sh ExecStart=/bin/systemctl start server.service ExecStart=/bin/bash -c 'ls -1rt /home/pi/Desktop/MinecraftServer/Save | head -n-2 | xargs -I save rm /home/pi/Desktop/MinecraftServer/Save/save' ExecStart=/bin/bash -c 'dropbox_uploader -q list / | awk {\'print $3\'} | xargs -I TATA dropbox_uploader delete TATA' ExecStart=/bin/bash -c 'ls -1rt /home/pi/Desktop/MinecraftServer/Save | xargs -I TUTU dropbox_uploader upload /home/pi/Desktop/MinecraftServer/Save/TUTU /' [Install] WantedBy=multi-user.target
Mon problème se trouve en fait sur cette partie de mise à jour automatique. Le reste a fonctionné pendant plusieurs mois sans problèmes avant que je ne me penche sur cette possibilité de mettre à jour le serveur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #!/bin/sh cd /home/pi/Desktop/MinecraftServer/UpdateSpigot sudo wget -nd https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -O BuildTools.jar sudo java -Xmx1024M -jar BuildTools.jar --rev 1.13.2 cd /home/pi/Desktop/MinecraftServer/Server tar -cvzf /home/pi/Desktop/MinecraftServer/UpdateSpigot/logsave-$(date +%Y%m%d-%H%M).tar.gz logs sudo rm spigot.jar logs -r cd cp /home/pi/Desktop/MinecraftServer/UpdateSpigot/spigot-1.13.2.jar /home/pi/Desktop/MinecraftServer/Server/spigot.jar
Pour résumer, la procédure recommandée par les développeurs du serveur serait de retélécharger le fichier BuildTools.jar qui est actualisé régulièrement. Ca, ça marche visiblement.
Une fois que j'ai le fichier BuildTools.jar je le lance avec Java, mais quel que soit son emplacement, les fichiers créés (et notamment le spigot.jar qui se trouve être le serveur) se trouvent là où je me trouve lorsque j'exécute la commande (ou lorsque systemd exécute la commande d'ailleurs). C'est d'ailleurs pour ça que j'ai choisi de passer par un script .sh.
Seulement voilà, j'ai l'impression que les dernières commandes de mon serversave.service se lancent sans attendre la fin du script .sh de la mise à jour du serveur... Je parle bien d'impression car le serversave.service arrive à son terme sans, mais le server.service n'est pas relancé comme il le devrait...
Auriez-vous des suggestions pour que cette mise à jour fonctionne ?
PS : J'avais envisagé d'autres alternatives à l'appel au script. Au début je voulais avoir toutes mes commandes directement dans le serversave.service, mais je n'ai pas trouvé de solutions pour exécuter correctement le BuildTools.jar en passant par java (mais s'il en existe je suis preneur !).
Sinon, ne serait-ce pas plus simple de faire d'autres services (au moins 2 je dirais) qui se lanceraient une fois le précédent achevé ? Ca permettrait de lancer un service qui s'appliquerait dans un répertoire bien défini...
Partager