22 octobre 2013

Minecraft : Un script pour démarrer son serveur sous Linux

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.

minecraft_sever_creeper

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.

36 commentaires pour “Minecraft : Un script pour démarrer son serveur sous Linux

  1. Laurent dit :

    Super bien ;)

  2. Thomas dit :

    Vraiment cool je testerai prochainement :)

  3. Skritz dit :

    Merci pour les commentaires :)
    N'hésitez pas à laisser un retour si ça ne fonctionne pas comme prévu.

  4. Thorfin89 dit :

    Merci pour ce script. Un petit rectificatif, Les options de commande ne sont précédées par un "-"

    exemple :
    ./minecraft start

  5. Skritz dit :

    Bien vu, je corrige, merci.

  6. sliceHS dit :

    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)

  7. Skritz dit :

    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.

  8. Stcop dit :

    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 :)

  9. Skritz dit :

    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"

  10. stcop dit :

    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.

  11. Dark Wood dit :

    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.

  12. Skritz dit :

    Désolé, 1 mois après... mais à priori on peut mettre des espaces sans soucis !

  13. LTDJ dit :

    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 ?

  14. Skritz dit :

    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.

  15. KalleKilleur dit :

    je n'arrive toujours pas à acceider au serveur même avec tes conseille

  16. Alan700 dit :

    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.

  17. Skritz dit :

    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)

  18. Alan700 dit :

    Alors Java est bien installer et quand je tape la commande sa marche et je précise que c'est forge.

  19. Skritz dit :

    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

  20. Alan700 dit :

    ouais ok je vais essayer. Mais il ne faut pas le mettre dans /etc/init.d/

  21. Skritz dit :

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

  22. Euh sa marche sur une CraftBox de chez DediShop ? (En gros un VPN couper pour avoir des serveur en masse) ?

  23. Skritz dit :

    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.

  24. Pirlouit dit :

    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.

  25. Skritz dit :

    Content que ça fonctionne toujours ! :)

  26. Waymix dit :

    Franchement, un script aussi parfait... GG !

  27. DarkRails dit :

    Grâce à ce script le /restart et /stop sont disponible en jeu ?

  28. lucachipiz0 dit :

    moi sa me met:

    bash: ./minecraft.sh: /bin/bash^M: bad interpreter: No such file or directory

    Voila je sais pas trop comment faire

  29. Skritz dit :

    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 :)

  30. AzenoX dit :

    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 ?

  31. Skritz dit :

    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 !

  32. cooenctiion dit :

    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

  33. Skritz dit :

    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

  34. coonectiion dit :

    Merci! sa marche parfaitement, je te remercie beaucoup ;D

  35. Skritz dit :

    Cool, tant mieux !

Laisser un commentaire