Il y a quelques mois, j'ai installé une machine sous Linux pour faire tourner un petit serveur Minecraft. Après avoir pas mal galéré pour tenter d'adapter le script de démarrage que l'on peut trouver sur le wiki, j'ai fini par abandonner et créer mon propre script. Il est beaucoup plus simple et me convient parfaitement, j'en profite donc pour le partager avec vous.
Prérequis : screen
Screen est un outil indispensable car il permet d'ouvrir plusieurs terminaux simultanément et de les faire tourner en tache de fond. Vous n'avez donc pas besoin de laisser la console ouverte en permanence et pouvez vous y connecter à tout moment. Le script utilise screen et il est donc possible de faire tourner facilement plusieurs serveurs sur la même machine simplement en dupliquant le script et en modifiant les variables.
Il n'est en général pas présent par défaut et il faut l'installer. Pour ceci, utilisez la commande suivante (fonctionne sous Ubuntu, Debian et surement d'autres) :
apt-get install screen
Quelques commandes pour utiliser screen :
Pour afficher la liste de tous les écrans disponibles
screen -ls
Pour se connecter à l'écran nommé "nomduscreen"
screen -r nomduscreen
Quand vous êtes sur un écran, vous pouvez le quitter en appuyant sur "Ctrl+a" puis sur la touche "d".
Le script shell
#!/bin/bash # ------------------------------------------------- # PARTIE A EDITER : # ------------------------------------------------- SCREEN="adventure" # nom utilisé pour le screen NAME="Adventure land" # nom du serveur, uniquement pour l'affichage des messages COMMAND="java -jar -Xincgc -Xmx1G minecraft_server.jar" # commande de lancement du serveur # Cette ligne peut-être supprimée si le serveur # et le script sont dans le même dossier : cd /home/minecraft/mc_adventure/ # emplacement du serveur # ------------------------------------------------ running(){ if ! screen -list | grep -q "$SCREEN" then return 1 else return 0 fi } case "$1" in start) if ( running ) then echo "Server [$NAME] is already running" else echo "Starting server [$NAME]" screen -dmS $SCREEN $COMMAND fi ;; status) if ( running ) then echo "Running" else echo "Not running" fi ;; screen) screen -r $SCREEN ;; reload) screen -S $SCREEN -p 0 -X stuff `printf "reload\r"` ;; stop) if ( running ) then screen -S $SCREEN -p 0 -X stuff `printf "stop\r"` echo "Stopping server [$NAME]" else echo "Server [$NAME] is not running" fi ;; *) echo "Usage : {start|stop|status|screen|reload}" exit 1 ;; esac exit 0
Installation et configuration
Bon, déjà j'aime mieux prévenir, je ne suis pas un pro du linux, je bricole. Je ne vais donc tenter de vous donner quelques indications, mais si ce n'est pas suffisamment clair il faudra chercher ailleurs. :)
Avant de passer au script, je vous conseille de commencer par avoir un serveur Minecraft qui fonctionne déjà. Pour cela, je vous renvoi à d'autres tutos, comme par exemple celui-ci.
Le script devrait être assez simple à utiliser. Il faut créer un nouveau fichier, par exemple "minecraft.sh" et y coller tout le joli code ci-dessus. Donnez les droits d’exécution à ce fichier avec la commande : chmod +x minecraft.sh
Ensuite, vous aurez simplement à modifier les premières lignes :
# ------------------------------------------------- # PARTIE A EDITER : # ------------------------------------------------- SCREEN="adventure" # nom utilisé pour le screen NAME="Adventure land" # nom du serveur, uniquement pour l'affichage des messages COMMAND="java -jar -Xincgc -Xmx1G minecraft_server.jar" # commande de lancement du serveur cd /home/minecraft/mc_adventure/ # emplacement du serveur # ------------------------------------------------
SCREEN="xxx" : Remplacez xxx par le nom du screen désiré. Le nom importe peu, c'est juste pour le retrouver facilement, il faut juste qu'il soit unique.
NAME="yyy" : De même, le nom n'est pas important pour le fonctionnement du script, il sert juste à afficher des joli messages et savoir quel serveur vous avez lancé si vous en avez plusieurs.
COMMAND="java -jar -Xincgc -Xmx1G minecraft_server.jar" : La commande à exécuter par le script pour démarrer le serveur. Si vous utilisez un serveur différent, c'est ici qu'il faudra faire la modification en remplaçant minecraft_server.jar par le bon nom de fichier.
Dernière élément à modifier, remplacez /home/minecraft/mc_adventure/ par le répertoire ou est situé votre fichier jar. Si vous ne le connaissez pas, placez le script directement dans le même dossier que votre serveur et supprimez complètement cette ligne.
Si vous voulez lancer plusieurs serveurs en même temps c'est tout à fait possible, il suffit de dupliquer le script et de changer le nom du screen ainsi que le dossier du serveur.
Utilisation du script
Les paramètres sont affichés en appelant ./minecraft.sh (si vous l'avez appelé comme cela bien-sur) :
./minecraft.sh
Usage : {start|stop|status|screen|reload}
Démarrer le serveur
./minecraft.sh start
Arrêter le serveur
./minecraft.sh stop
Affiche l'état sur serveur (Running ou Stopped)
./minecraft.sh status
Pour se placer dans le terminal (le screen) du serveur
./minecraft.sh screen
Quitter le terminal en appuyant sur ctrl+a suivi de d.
Recharger la configuration du serveur et de ses plugins
./minecraft.sh reload
Conclusion
J'espère que cet article ne sera pas trop confus !
Je rappelle que ce script n'est utile qu'une fois que votre serveur fonctionne bien, il sert à le démarrer et le configurer plus facilement. Si vous avez des soucis pour créer votre serveur, je vous renvoi vers l'article du wiki.
Super bien ;)
Vraiment cool je testerai prochainement :)
Merci pour les commentaires :)
N'hésitez pas à laisser un retour si ça ne fonctionne pas comme prévu.
Merci
Merci pour ce script. Un petit rectificatif, Les options de commande ne sont précédées par un "-"
exemple :
./minecraft start
Bien vu, je corrige, merci.
Salut ! Merci pour ce petit tuto ^^'
Juste une question, ou faut-il placer le fichier minecraft.sh ?
(j'ai un niveau très nul dans ce domaine)
Bonjour ^^
Tu peux le mettre à n'importe quel endroit, sachant que l'emplacement du serveur est déterminée dans les paramètres au début du script.
Tu peux le placer dans le même dossier que le serveur par exemple.
Bonjour, merci beaucoup pour ton script :) Débutant en la matière, il est un bon exemple me permettant d'analyser les différentes conditions utilisées et surtout les comprendre, ou pas.
Tu le dis toi même, si ce n'est pas clair pour nous, allons chercher ailleurs. Cependant c'est plutôt clair pour moi j'arrive à me le traduire pour l'essentiel, mais il y a deux lignes qui me posent soucis.
J'en copie colle une d'elles:
screen -S $SCREEN -p 0 -X stuff "`printf "reload\r"`"
En voyant cela, je me dis pourquoi n'est il pas suffisant d exécuter les commandes suivantes :
#on récupère le screen de la console du serveur:
screen -r $SCREEN
#on lance le redémarrage:
reload
Partant de cette idée, en voyant la ligne nécessaire au bon fonctionnement de l execution de la commande, je me suis demandé ce que pouvait bien signifier tout ces caractères.
J'aurai donc aimé savoir si tu pouvais me les expliquer stp en "détails".
Merci d'avance :)
En fait, si tu exécute directement la commande screen -r, tu vas te retrouver directement dans l'écran qui contient le serveur. En utilisant la commande -X, ça nous permet d'envoyer des commandes directement à cet écran sans s'y connecter.
Détaillons la commande que tu as copié :
-S $SCREEN : Cette commande sélectionne le bon écran, celui vers lequel on va envoyer les commandes suivantes
-p 0 : Il est possible de créer plusieurs fenêtres dans les écrans, même si ça sera rarement le cas. Ici, on s'assure qu'on enverra bien nos commandes dans le premier, c'est à dire celui qui porte le numéro 0.
-X stuff blabla : -X permet d'envoyer une commande à l'écran choisi. Seulement on n'envoi pas une commande linux dans ce cas, on veut écrire dans la console du serveur, et c'est la qu'intervient la commande stuff.
Celle-ci permet "d'écrire" directement dans la fenêtre, comme si on tapait sur le clavier.
blabla est à remplacer par la commande minecraft voulue. Seulement il reste un dernier soucis, il faut valider la commande, comme si l'on appuyait sur la touche entrée. C'est la qu'intervient le \r qui permet d'écrire un retour à la ligne. La commande printf est la pour transformer ce \r en retour à la ligne (pour être sur qu'on écrit pas bêtement \r en fait).
Il y a d'autres façons d'écrire un retour à la ligne, par exemple en écrivant ^M à la fin. Il y a des informations intéressantes ici : http://unix.stackexchange.com/questions/13953/sending-text-input-to-a-detached-screen
Pour terminer, je me rend compte que "`printf "reload\r"`" est inutilement compliqué, et qu'on peut aussi bien écrire `printf "reload\r"`. Ecrire "reload^M" fonctionne aussi, et ça me parait plus simple. La commande finale pourrait donc être remplacée par :
screen -S $SCREEN -p 0 -X stuff "reload^M"
Excellent, c'est exactement ce que je voulais comprendre, je te remercie mille fois pour cette explication qui je l'espère en aidera d'autre.
Pas mal la simplification aussi :) très pratique je l'avoue.
Script très intéressant qui m'a apprit beaucoup de chose notamment l'explication dans les commentaire la seul chose qui ma chagrine, c'est le fait de ne pas pouvoir mettre d'espace dans les commandes.
Désolé, 1 mois après... mais à priori on peut mettre des espaces sans soucis !
J'aimerai exécuter d'autres commandes, du genre : say Le serveur redémarre dans X secondes. Sauf que j'ai remarqué que dans le printf on ne peut pas utilisé d'espace, comment faire ?
Essaye avec quelque chose comme ça :
screen -S $SCREEN -p 0 -X stuff "say Le serveur redémarre dans 5 minutes^M"
Cette syntaxe semble être plus simple et plus pratique, je modifierai l'article si ça fonctionne bien.
je n'arrive toujours pas à acceider au serveur même avec tes conseille
Bonjour excuser de te déranger mais quand je fais ./minecraft start sa me dit -bash: ./minecraft: Aucun fichier ou dossier de ce type. Si tu c'est pourquoi sa fais sa sa serait super. A oui je suis sur debian 8 pour info.
Bonjour Alan
Je n'ai pas d'idée précise, mais voici quelques pistes à tester :
- Est-ce que Java est bien installé et fonctionne ?
- Est-ce que le serveur démarre si tu lances directement la commande ? ( dans le tuto, c'est java -jar -Xincgc -Xmx1G spigot.jar par exemple)
Alors Java est bien installer et quand je tape la commande sa marche et je précise que c'est forge.
Vérifie qu'il y a les droits d'exécution sur le fichier (avec chmod +x minecraft.sh).
Sinon, tu peux essayer en écrivant le nom complet :
./minecraft.sh start
ouais ok je vais essayer. Mais il ne faut pas le mettre dans /etc/init.d/
Pour /etc/init.d/ : pas forcément.
Encore une fois je ne suis pas un spécialiste... mais ce dossier sert pour appeler les script au démarrage du serveur par exemple (mais il y a d'autres opérations à faire dans ce cas).
Euh sa marche sur une CraftBox de chez DediShop ? (En gros un VPN couper pour avoir des serveur en masse) ?
Bonjour
Alors je ne connais pas bien les CraftBox, mais il faut pouvoir exécuter des scripts Shell pour que ça fonctionne (disposer d'un accès SSH par exemple), donc je ne suis pas sur que ce soit possible.
Bonjour,
Un grand merci pour ton script. Pas de soucis, pas de problèmes. Un rêve.
C'est chouette de ne pas devoir réfléchir de temps en temps.
Content que ça fonctionne toujours ! :)
Franchement, un script aussi parfait... GG !
Grâce à ce script le /restart et /stop sont disponible en jeu ?
moi sa me met:
bash: ./minecraft.sh: /bin/bash^M: bad interpreter: No such file or directory
Voila je sais pas trop comment faire
lucachipiz0 :
Le ^M n'est pas normal. Il doit y avoir un caractère spécial généré par Windows que Linux ne comprend pas à la fin de la ligne.
Essaye de copier le script autrement ou de modifier le script sous linux, par exemple en effaçant la fin de la première ligne et en la réécrivant ?
Sinon essaye de chercher "/bin/bash^M: bad interpreter: No such file or directory" sur google, je pense que tu trouveras pas mal de réponses.
Bon courage :)
Salut, alors premièrement, très bon script :D
Seul problème: lorsqu'on tappe la commande /restart depuis la console, le serveur s'éteint mais ne se redémarre pas... Je sais pas vraiment d'ou ça vient, je pense que c'est du au fait que le script pense encore que le serveur est ouvert. Mais dans ce cas, comment faire ?
Bonjour et merci
Je pense que le restart arrête le "screen" et le serveur ne peut donc plus redémarrer. Je n'ai pas vraiment de solution pour être honnête !
Salut,
je cherche a faire tourner un serveur minecraft (le fichier est "spigot-1.12.jar") donc dans la partie a éditer je met:
# -------------------------------------------------
# PARTIE A EDITER :
# -------------------------------------------------
SCREEN="survie-alan" # nom utilisé pour le screen
NAME="survie-1" # nom du serveur, uniquement pour l'affichage des messages
COMMAND="java -jar -Xincgc spigot-1.12.jar" # commande de lancement du serveur
cd /home/coonectiion/Bureau/Serveurs/Survie-Alan # emplacement du serveur
# ------------------------------------------------
et pour le reste, je copie-colle mais quand j'execute le fichier il me donne 4 erreurs:
coonectiion@coonectiion-3:~$ ./survie.sh start
./survie.sh: ligne 7: $'\r' : commande introuvable
./survie.sh: ligne 10: $'\r' : commande introuvable
./survie.sh: ligne 11: erreur de syntaxe près du symbole inattendu « $'{\r' »
'/survie.sh: ligne 11: `running(){
Merci d'avance pour ta réponse ;D
Bonjour,
Je pense que c'est un soucis avec les retours à la ligne "\r" sous Windows mais qui ne sont pas compris sous linux
Essaye ça peut être :
http://patatos.over-blog.com/article-cygwin-erreur-r-command-not-found-45126840.html
Merci! sa marche parfaitement, je te remercie beaucoup ;D
Cool, tant mieux !
Votre script ne fonctionne absolument pas.
Assurez-vous de savoir ce que vous faites avant de balancer un code approximatif.
bonjour,
marche au top !
faut juste bien le configurer et avoir installer le serveur de base.
Concernant la version bedrock, je n'arrive par contre pas à le lancer.
Une idée?
Bonjour Marin et merci
Pour la version Bedrock, je n'ai jamais testé, désolé. Ca fait un bon moment que je n'ai pas lancé Minecraft !
ça fonctionne nickel BRAVO et merci beaucoup pour ce script !
C'est super j'adore
Hello,
sa me met :
start.sh: 19: Syntax error: word unexpected (expecting "in")
je suis sous debian 12
merci a vous