Minecraft-Server automatisch aktualisieren

icon-mcWer gerne die aktuellste Snapshot-Version von Minecraft spielt, nimmt auch die „Risiken“ in Kauf, die mit einer solchen Snapshot-Version einhergehen. Solche Snapshots erscheinen für Minecraft beinahe täglich und stellt den Minecraft-Server-Betreiber somit vor das Problem, ständig den Server aktualisieren zu müssen. Um diesen Vorgang zu automatisieren, habe ich mir ein kleines Bash-Script gebastelt, dass die dazu notwendigen Schritte automatisiert.

 

 

Einrichtung eines init-Scripts

Zunächst fügen wir ein init-Script hinzu, damit wird Minecraft bequem starten und stoppen können. Dazu editieren wir die neue Datei „/etc/init.d/minecraft“ und fügen folgenden Inhalt ein:

 

#!/bin/bash
# /etc/init.d/minecraft
# version 0.3.2 2011-01-27 (YYYY-MM-DD)

### BEGIN INIT INFO
# Provides:  minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop:  $local_fs $remote_fs
# Should-Start:  $network
# Should-Stop:    $network
# Default-Start:  2 3 4 5
# Default-Stop:  0 1 6
# Short-Description:    Minecraft server
# Description:    Starts the minecraft server
### END INIT INFO

#Settings
SERVICE='minecraft_server.jar'
USERNAME="loginuser"
MCPATH='/home/loginuser/minecraft'
CPU_COUNT=4
INVOCATION="java -Xmx2048M -Xms2048M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts -jar minecraft_server.jar nogui"
BACKUPPATH='/home/loginuser/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 $INVOCATION"
    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
}


#Start-Stop here
case "$1" in
  start)
    mc_start
    ;;
  stop)
    mc_stop
    ;;
  restart)
    mc_stop
    mc_start
    ;;
  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

 

Hierbei können wir die notwendigen Zeilen an die eigenen Gegebenheiten anpassen, die beispielsweise angeben, an welcher Stelle Minecraft entpackt wurde. In meinem Fall betreibe ich Minecraft im Verzeichnis „/home/loginuser/minecraft„, die auszuführende Datei heißt „minecraft_server.jar“ und der Nutzer, unter welchem der Minecraft-Server läuft heißt „loginuser„.

 

wget installieren

Für unser Script benötigen wir das Programm „wget“ dass wir wie folgt installieren:

apt-get install wget

 

Update-Script

Im Anschluss erstellen wir eine neue Datei, beispielsweise mit

nano /home/loginuser/minecraft/update-minecraft.sh

und fügen folgendes Script ein:

#!/bin/bash
HOMEDIR='/home/loginuser/minecraft'
###################################

wget -O $HOMEDIR/versions.json -qN https://s3.amazonaws.com/Minecraft.Download/versions/versions.json

if ! [[ $? = 0 ]]; then
    echo "Versionsdatei konnte nicht heruntergeladen werden."
    exit 1;
fi

VER=`sed -n -e '/\"latest\"/,/}/ s/.*\"snapshot\": \"\([^\"]*\)\".*/\1/p' < $HOMEDIR/versions.json`
rm $HOMEDIR/versions.json

if [ -f $HOMEDIR/installierteversion.txt ]; then
        INSTVER=`cat $HOMEDIR/installierteversion.txt`

        if [ "$VER" = "$INSTVER" ]; then
                echo "Die installierte Version ist aktuell."
                exit 0;
        fi
fi


echo "Minecraft wírd auf Version $VER aktualisiert."
/etc/init.d/minecraft stop

if ! [[ $? = 0 ]]; then
        echo "Minecraft konnte nicht gestoppt werden."
        exit 1;
fi

wget -O $HOMEDIR/minecraft_server.$VER.jar -N https://s3.amazonaws.com/Minecraft.Download/versions/$VER/minecraft_server.$VER.jar

if ! [[ $? = 0 ]]; then
        echo "Herunterladen nicht erfolgreich."
        exit 1;
fi

rm $HOMEDIR/minecraft_server.jar
mv $HOMEDIR/minecraft_server.$VER.jar $HOMEDIR/minecraft_server.jar

echo $VER > $HOMEDIR/installierteversion.txt

/etc/init.d/minecraft start

echo "Update abgeschlossen."

 

Dem Script erlauben wir die Ausführung mit

chmod +x /home/loginuser/minecraft/update-minecraft.sh

und erstellen einen neuen Crontab, damit das Script regelmäßig ausgeführt wird.

 

Cronjob erstellen

Den Crontab-Editor öffnen wir immer mit

crontab -e

wobei wir beim ersten Start nach unserem favorisierten Editor gefragt werden. „nano“ ist hier zunächst eine gute Wahl.

 

Anschließend fügen wir folgende Zeile ein:

0 0 * * * /home/loginuser/minecraft/update-minecraft.sh

 

Nach dem Speichern und Schließen der Crontabs wird nun das Update-Script stündlich ausgeführt. Zu beachten ist dabei, dass der Client ebenfalls über die neuste Snapshot-Version verfügt und für die Installation von Snapshots konfiguriert wurde.

 

Übersicht der Versionen

Die jeweils aktuellste Version von Minecraft ist auf dieser Seite sehr übersichtlich gelistet: https://mcversions.net