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).
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
Mon fichier run.sh contien ces lignes :
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
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
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 :
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
Un fichier serversave.service :
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
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
#!/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
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.

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