Faire tourner un serveur minecraft comme un service

Faire tourner un serveur minecraft comme un service

Suite à mon dernier billet (cf Créer un serveur Minecraft sur un Kimsufi), le problème qui se posait était que pour lancer un serveur minecraft, nous étions obligé de garder une console ssh d’ouverte, ce qui n’est pas pratique il faut le reconnaitre.

En effet si pour une raison ou une autre vous fermiez votre session, le serveur s’arrêtait aussitôt!

De plus je ne sais pas vous, mais devoir lancer à chaque fois une commande de type:

java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

ne m’enchantait pas vraiment! (pas facile à retenir ^^).

La solution pour cela est de lancer Minecraft comme un service à part entière. De cette façon il fonctionnera de la même façon que les services Apache ou Mysql par exemple (vous pourrez utiliser des commandes simple pour stop, start et restart le serveur Minecraft!).

Mettre en place le service Minecraft sur Ubuntu.

Pour pouvoir lancer le serveur minecraft en “fond de tâche” il faut effectuer quelques commandes simples que voici:

On créé un fichier “minecraft” dans le dossier “/etc/init.d”

vim /etc/init.d/minecraft

Dans ce fichier copiez-collez le script suivant en veillant à vous assurer que les variables et chemins suivants sont bien définis.

SERVICE : Nom du serveur minecraft que vous avez téléchargé (par défaut vous avez du mettre minecraft_server.jar)

USERNAME : Nom de l’utilisateur linux qui lance le service, root par défaut

MCPATH : Chemin absolu vers votre dossier “Minecraft”

BACKUPPATH : Chemin absolu vers le dossier de backup.

#!/bin/bash
# /etc/init.d/minecraft

#Settings
SERVICE='minecraft_server.jar'
USERNAME="root"
MCPATH='/home/minecraft/'
BACKUPPATH='/home/minecraft/minecraft.backup/'

ME=`whoami`
as_user() {
  if [ "$ME" == "$USERNAME" ] ; then
    bash -c "$1"
  else
    su - $USERNAME -c "$1"
  fi
}

mc_start() {
  if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  then
    echo "Tried to start but $SERVICE was already running!"
  else
    echo "$SERVICE was not running... starting."
    cd $MCPATH
    as_user "cd $MCPATH && screen -dmS minecraft java -Xmx1024M -Xms1024M -jar minecraft_server.jar  nogui"
    sleep 7
    if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
    then
      echo "$SERVICE is now running."
    else
      echo "Could not start $SERVICE."
    fi
  fi
}

mc_saveoff() {
        if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
   then
      echo "$SERVICE is running... suspending saves"
      as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'"
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
                sync
      sleep 10
   else
                echo "$SERVICE was not running. Not suspending saves."
   fi
}

mc_saveon() {
        if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
   then
      echo "$SERVICE is running... re-enabling saves"
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'"
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
   else
                echo "$SERVICE was not running. Not resuming saves."
   fi
}

mc_stop() {
        if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
        then
                echo "$SERVICE is running... stopping."
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'"
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
                sleep 10
                as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'"
                sleep 7
        else
                echo "$SERVICE was not running."
        fi
        if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
        then
                echo "$SERVICE could not be shut down... still running."
        else
                echo "$SERVICE is shut down."
        fi
}

mc_update() {
  if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  then
    echo "$SERVICE is running! Will not start update."
  else
    MC_SERVER_URL=http://minecraft.net/`wget -q -O - http://www.minecraft.net/download.jsp | grep minecraft_server.jar\ | cut -d \" -f 2`
    as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
    if [ -f $MCPATH/minecraft_server.jar.update ]
    then
      as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/minecraft_server.jar"
      echo "Minecraft successfully updated."
    else
      echo "Minecraft update could not be downloaded."
    fi
  fi
}

mc_backup() {
  if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  then
#    echo "$SERVICE is running! Will not start backup."
#  else
    echo "Backing up minecraft data"
    if [ -d $BACKUPPATH/world_`date "+%m.%d.%Y"` ]
    then
      for i in 1 2 3 4 5 6
      do
        if [ -d $BACKUPPATH/world_`date "+%m.%d.%Y"`-$i ]
        then
          continue
        else
          as_user "cd $MCPATH && cp -r world $BACKUPPATH/world_`date "+%m.%d.%Y"`-$i"
          break
        fi
      done
    else
      as_user "cd $MCPATH && cp -r world $BACKUPPATH/world_`date "+%m.%d.%Y"`"
    fi
    echo "Backing up the minecraft server executable"
    if [ -f "$BACKUPPATH/minecraft_server_`date "+%m.%d.%Y"`.jar" ]
    then
      for i in 1 2 3 4 5 6
      do
        if [ -f "$BACKUPPATH/minecraft_server_`date "+%m.%d.%Y"`-$i.jar" ]
        then
          continue
        else
          as_user "cd $MCPATH && cp minecraft_server.jar \"$BACKUPPATH/minecraft_server_`date "+%m.%d.%Y"`-$i.jar\""
          break
        fi
      done
    else
      as_user "cd $MCPATH && cp minecraft_server.jar \"$BACKUPPATH/minecraft_server_`date "+%m.%d.%Y"`.jar\""
    fi
  fi
  echo "Backup complete"
}

#Start-Stop here
case "$1" in
  start)
    mc_start
    ;;
  stop)
    mc_stop
    ;;
  restart)
    mc_stop
    mc_start
    ;;
  update)
    mc_stop
    mc_backup
    mc_update
    mc_start
    ;;
  backup)
    mc_saveoff
    mc_backup
    mc_saveon
    ;;
  status)
    if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
    then
      echo "$SERVICE is running."
    else
      echo "$SERVICE is not running."
    fi
    ;;

  *)
  echo "Usage: /etc/init.d/minecraft {start|stop|update|backup|status|restart}"
  exit 1
  ;;
esac

exit 0

Une fois le fichier enregistré, il faut maintenant lui accorder les droits nécéssaires à sa bonne execution (755).

chmod 755 /etc/init.d/minecraft

Maintenant on installe le lien symbolique “minecraft” qui nous permettra de facilement executer des actions sur le serveur Minecraft.

update-rc.d minecraft defaults

Voilà tout est prêt, vous pouvez maintenant lancer votre serveur simplement avec la commande suivante:

/etc/init.d/minecraft start

Pour les autres commandes disponibles vous avez:

start : Démarrer le serveur Minecraft si celui-ci est éteint.

stop : Arrêter le serveur Minecraft si celui-ci était allumé.

restart : Fait un stop puis un start du serveur, idéal quand celui-ci bug!

status : Vous indique si le serveur est toujours sur pied ou si il est down

backup : Effectue une sauvegarde du serveur (map comprise), idéal dans le cas ou vous auriez un gros crash serveur.

update : Effectue une mise à joujr en faisant une sauvegarde du serveur actuel et en téléchargeant le nouveau “.jar”. Jamais testé, je préfère le faire manuellement!

14 thoughts to “Faire tourner un serveur minecraft comme un service”

  1. bonjour, merci pour ce beau turoriel, mais j’ai un probleme:
    ‘brian@serveur:/$ sudo /etc/init.d/minecraft start
    minecraft_server.jar was not running… starting.
    Could not start minecraft_server.jar.’
    mais je ne sais pas pourquoi le serveur refuse de démarrer mon minecraft, pourtant le chemin est bon.
    J’ai essayé avec ‘brian’ comme username aussi, mais pareil.
    je suis sur ubuntu 10.4 server
    merci de m’avoir lu

  2. Plusieurs pistes pour toi:
    – Le minecraft_server.jar a t-il les droits nécéssaires? Un chmod 755 est recommandé.

    – Les chemins renseignés sont-ils bons?

  3. Hello,

    Y’a pas un problème à cette ligne ?
    as_user “cd $MCPATH && screen -dmS minecraft java -Xmx1024M -Xms1024M -jar craftbukkit-0.0.1-SNAPSHOT.jar nogui”

    Craftbukkit n’a pas été installé dans le tuto fait précédemment.

  4. En effet, tournant sur Minecraft Bukkit (je ferais sans doute un tuto la dessus), j’ai oublié de modifié cette ligne pour le tuto.

    J’ai fait la modif merci bien!

  5. Petit hic? lequel ? Il suffit d’utiliser la commande “screen” avant la ligne java pour pouvoir fermer l’invite de commande 😉
    Ensuite pour reprendre la main, il faut faire tout simplement :
    screen -r pty…. (num de l’interface) …

  6. D’accord et pour lancer facilement le serveur, pour le restarter facilement sans endommager la map etc etc.. il faut reconnaitre que ce petit script est plus pratique non?

    Cela dit je ne connaissais pas trop cela je note l’astuce!

  7. Bonjour,

    Tout d’abord merci pour ton super tuto 🙂
    Moi je suis chez OVH sous Gentoo Release 2.
    J’ai un petit “souci”, actuellement pour jouer je suis obligé de passer par PUTTY et d’y insérer a chaque fois les lignes suivantes :

    export PATH=/usr/local/bin/jdk1.6.0_24/bin:$PATH
    cd /home
    cd minecraft
    java -Xmx2048M – Xms2048M -jar minecraft_server.jar nogui

    Les lignes suivantes ne fonctionnent pas pour moi :

    update-rc.d minecraft defaults
    -bash > update-rc.d command not found

    et

    /etc/init.d/minecraft start
    : command not foundft: line 4:
    : command not foundft: line 16:
    : command not foundft: line 22:
    : command not foundft: line 31:
    : command not foundft: line 49:
    : command not foundft: line 63:
    : command not foundft: line 74:
    : command not foundft: line 94:
    : command not foundft: line 112:
    : command not foundft: line 153:
    /etc/init.d/minecraft: line 186: syntax error near unexpected token `newline’
    ‘etc/init.d/minecraft: line 186: `

    Je suppose qu’il s’agit du fait que je tourne avec Gentoo mais n’y connaissant pas gd chose… j’en appelle à votre aide 😉

    Merci beaucoup

  8. Malgré que je n’y connais pas grand chose, j’ai trouvé mes erreurs Voici la solution pour ceux qui aurait le même problème.

    rc-update add minecraft default
    Ensuite en ce qui concerne les autres erreurs, il s’agissait d’un retour à la ligne.. j’ai supprimé tous les espaces… et cela marche maintenant

  9. Bonjour ,
    j’ai un gros probleme c’est que quand je lance l’application ” minecraft ” , j’obtien ceci : http://www.hapshack.com/?v=asupprysy.png

    mais le serveur ne s’ouvre pas !
    j’ai essayer la commande ” start ”
    mais quand j’ecri start ya ecri :
    Unknown console command. Type “help” for help.
    je fait help , ensuite il y a ecri comment fermer le server mais pas comment l’ouvrir ! 🙁
    merci d’avance

  10. Salut, il y a un petit problème dans ton script : je l’ai remarqué car le nom du fichier jar chez moi est minecraft-server.jar et non minecraft_server.jar. Enfin bref ça c’est pas important, l’important c’est que pour démarrer le serveur du fait :
    as_user “cd $MCPATH && screen -dmS minecraft java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
    et il faudrait plutôt faire :
    as_user “cd $MCPATH && screen -dmS minecraft java -Xmx1024M -Xms1024M -jar $SERVICE nogui”
    Voilà j’espère que j’en aurai aidé certains d’entre vous 😉

  11. Bonjour,

    Le serveur me demande sans arret le mot de passe avant chaque commande. (il me le demande 3 fois avant de s’arreter..)
    comment puis-je le mettre de maniere automatique ?

  12. Bonjour,
    Il me marque “password for minecraft:”
    minecraft est la session sou laquelle tourne le serveur
    Help?
    Merci d’avance

  13. Merci pour ce tuto, par contre quand je fais : update-rc.d minecraft defaults, il me met l’erreur suivante :

    root@ks393243:/etc/init.d# update-rc.d minecraft defaults
    update-rc.d: using dependency based boot sequencing
    insserv: warning: script ‘minecraft’ missing LSB tags and overrides
    insserv: There is a loop between service munin-node and minecraft if stopped
    insserv: loop involving service minecraft at depth 2
    insserv: loop involving service munin-node at depth 1
    insserv: Stopping minecraft depends on munin-node and therefore on system facility `$all’ which can not be true!
    insserv: exiting now without changing boot order!
    update-rc.d: error: insserv rejected the script header

    du coup je ne sais pas le lancé au démarrage. (j’ai essayé plusieurs tuto pour lancer minecraft en script et automatiser la chose, avec les autres le lancement en script ne fonctionnait pas). (Par contre avec certain, la commande si dessus fonctionne et avec d’autres non)

  14. Les versions de Minecraft ont je pense beaucoup changé depuis la version alpha/béta que j’utilisais. Ayant totalement décroché et ayant fermé mon serveur, je ne pourrais malheureusement pas vous fournir l’aide dont vous avez besoin.
    Bonnes recherches à vous!

Leave a Reply

Your email address will not be published. Required fields are marked *