IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Mise à jour régulière d'un serveur minecraft (raspbian)


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Septembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2014
    Messages : 51
    Points : 49
    Points
    49
    Par défaut Mise à jour régulière d'un serveur minecraft (raspbian)
    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...

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 473
    Points
    19 473
    Par défaut
    Bonjour,

    je trouve bizarre tous ces execstart (je ne connais pas assez systemd pour présumer de leur comportement), j'aurais fais un script, appelé par un seul execstart, plutôt que tous ces appels à bashil y a une faute : devrait être d'ailleurs, [awk[/c] est-il indispensable - un simple cut ne conviendrait-il pas ?

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 740
    Points : 43 866
    Points
    43 866
    Par défaut
    Je suis d'accord avec N_BaH. Je pense qu'il faut utiliser une seule fois Execstart, bien que systemd doit tolérer.
    J'aurais tout mis dans un fichier bash, sauf l'arrêt du serveur dans ExecstartPre et le redémarrage dans ExecStartPost.

    Et il faut t'assurer que le service soit bien stoppé avant déclenchement de la sauvegarde, et que le serveur soit bien reparti sans erreurs après redémarrage. Peut-être une notification par mail.

    Tu peux tout faire depuis un script bash lancé par un cron, pas besoin de créer un service systemd pour la sauvegarde (mais tu peux aussi)

  4. #4
    Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Septembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2014
    Messages : 51
    Points : 49
    Points
    49
    Par défaut
    Bonjour, et merci pour vos réponses.

    Effectivement, je ne l'avais pas trop dit au départ, mais je ne suis pas du tout un expert de systemd.
    Du coup, concernant les ExecStart, j'avais vu que ça ne posait pas de problèmes de les enchaîner, que ça faisait comme un retour à la ligne dans un script. Mais effectivement, ce n'est eut être pas le plus efficace...
    Concernant le awk, je me souviens que ça n'avait pas été simple de le faire fonctionner, mais je ne sais plus exactement pourquoi j'en étais arrivé à cette formulation plutôt qu'une autre. Je ne veux pas dire de bêtises, mais il me semble que le souci venait de la liste renvoyée par dropbox_uploader. En fait, elle ne me permettait pas de supprimer les fichiers anciens sur la dropbox (je crois). Et puis comme je suis débutant dans le monde de linux, je me suis basé sur différentes lignes que j'ai trouvées à droite ou à gauche sur internet.

    Mais du coup, comment vérifier que le service est bien arrêté avant de lancer la suite ? C'est vrai que le temps qu'il sauvegarde tout et qu'il s'éteigne proprement il faut compter 2 ou 3 secondes environ.
    Après c'est vrai que j'avais vu la solution du cron, mais comme j'étais dans systemd, je suis passé par l'option du timer et du service. Mais est-ce qu'il serait plus simple de suivre l'arrêt des différents services à partir d'un cron par exemple ?

    En tous cas merci pour ces infos. Je vais commencer à convertir tout ça en un seul script. Ce sera effectivement bien plus simple.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 740
    Points : 43 866
    Points
    43 866
    Par défaut
    Je ne connais pas le fonctionnement d'un serveur Minecraft, mais quand tu sauvegardes un serveur, mais pour tout type de serveur, il faut s’assurer de la cohérence des données.
    Il ne faut pas que le serveur modifie les données pendant la sauvegarde, le plus simple étant de le désactiver le temps de la sauvegarde.

    Pour vérifier que le service soit bien arrêté, la commande est systemctl nom_du_service status. Il est possible aussi de vérifier la présence du fichier pid, surtout que comme c'est toi qui a créé le service et que tu débites, celui-ci n'est peut-être pas propre à 100%.

  6. #6
    Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Septembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2014
    Messages : 51
    Points : 49
    Points
    49
    Par défaut
    Hello, je reviens vers vous avec quelque nouvelles questions (quand je me replonge dans tout ça je vois des choses qui ne fonctionnent pas tout à fait).

    Effectivement, depuis le début mon idée est bel et bien de stopper proprement le serveur avant de faire une sauvegarde et de le redémarrer ensuite. D'ailleurs je reviendrais un peu après sur l'arrêt dudit serveur, parce que je crois que ça ne marche pas exactement comme je le voudrais...

    Du coup j'ai bien suivi vos conseils en mettant toutes les commandes dans un script qui est lancé via systemd. En gros ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ExecStartPre=/bin/systemctl stop server.service
    ExecStart=/home/pi/Desktop/MinecraftServer/UpdateSpigot/updatespigot.sh
    ExecStartPost=/bin/systemctl start server.service
    En sachant que sur ce service j'ai un Type=oneshot, et si je comprend bien le manuel d'utilisateur de systemd, la commande placée en ExecStartPost ne sera exécutée qu'une fois tous les processus lancés par ExecStart terminés.
    ExecStartPost= commands are only run after [...] the last ExecStart= process exited successfully for Type=oneshot
    Est-ce bien ça ?

    Sinon, pour revenir à l'arrêt "propre" du serveur dont je parlais plus haut, disons que généralement pour arrêter "proprement" mon serveur minecraft, je lance 2 commandes directement depuis le screen du serveur (un save-all pour faire une première sauvegarde de la map, et un stop qui va sauvegarder la position des joueurs ou leur inventaire entre autres choses). Mais j'ai l'impression que lorsque je lance systemctl stop server.service le processus screen est stoppé brutalement sans lancer les commandes voulues.
    Dans le premier message de ce post j'indiquais que dans mon server.service j'avais 2 lignes ExecStop qui devaient inscrire et exécuter ces 2 commandes dans le screen dédié au serveur minecraft. J'ai essayé de lancer manuellement le serveur dans un screen et d'exécuter ces commandes à la main en inscrivant le tout dans un log et là ça fonctionne niquel. Dans le log je trouve bien les commandes que j'ai lancées et je vois bien l'arrêt propre du serveur, ce qui n'est pas le cas lorsque j'arrête mon service avec systemd...
    Auriez-vous une idée de comment solutionner ce problème ?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 473
    Points
    19 473
    Par défaut
    alors, pour arrêter le serveur, je lancerais les commandes via screen plutôt que d'arrêter le script, ce qui probablement, en effet, arrête screen, mais pas les processus que, lui, a lancé.
    et donc, le "stop" (screen ... 'commande1; commande2') et le start (systemctl restart server) devraient être gérés dans le script update, et pas par des ExecStop/Start de systemd

  8. #8
    Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Septembre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2014
    Messages : 51
    Points : 49
    Points
    49
    Par défaut
    Ah oui, en effet, je n'y avais pas songé.
    Du coup après vérifications tout fonctionne parfaitement. Merci pour votre aide ! Je passe le post en résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mises à jour régulières de Sepi
    Par sjrd dans le forum Sepi
    Réponses: 92
    Dernier message: 19/09/2010, 13h15
  2. [Wamp] Wamp n'affiche pas les pages mises à jour sous win 2003 serveur
    Par mm551 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 04/01/2010, 14h22
  3. Mise à jour bibliothèque de mon serveur SQL
    Par dAvydAv dans le forum Débuter
    Réponses: 2
    Dernier message: 28/11/2007, 17h37
  4. Mise à jour de données sur serveur lié
    Par dezarnau dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/03/2007, 19h49
  5. [EJB3] Mise à jour des Entity coté serveur si modif coté client
    Par SeeNapse dans le forum Java EE
    Réponses: 8
    Dernier message: 23/01/2007, 07h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo