Minecraft-Server mit Screen steuern
Das man Minecraft-Server via
screen -dmS meinserver java -jar minecraft-server.jar -Xmx1G
in den Hintergrund starten lassen, man dann via
screen -r meinserver
wieder in die Minecraft-Konsole gelangt und zuletzt mit dem Tastenkürzel Ctrl+A, D die Minecraft-Konsole wieder verlässt sollte ein alter Hut sein.
Ich möchte hier vorstellen, wie man einfache Befehle (zB für Backups) auch ausführen kann ohne in die Mc-Konsole wechseln zu müssen. Diese Variante funktioniert mit allen gängigen Minecraft-Servern, wie z.B. Bukkit.
Im laufe des Artikels wird ein Bash-Steuerscript erstellt, welches dazu dient Befehle direkt ausführen zu können und dann ein simples Backups-Script erstellt welches das Steuerscript nutzt.
Fangen wir also an, zunächst schreiben wir uns das Grundgerüst des Steuerscriptes:
#!/bin/bash # der Dateiname der Server-Jar, darf auch ein absoluter Pfad sein SERVER_NAME="minecraft_server.jar" # der Name der Screen-Session die Erstellt und verwaltet wird SCREEN_NAME="meinserver" if [ $# -gt 0]; then case $1 in "start") ;; "stop") ;; "restart") ;; "save-off") ;; "save-on") ;; "save-all") ;; "say") ;; "--help") ;; esac; else $0 --help; fi;
Nun kann man schon grob erahnen wo das ganze hin führen wird. Wir werden in der Lage sein, den Server von der normalen Linux-Konsole aus zu stoppen, zu starten, neu zu starten, die Welt zu speichern und etwas als [SERVER] zu sagen. Des weiteren schreiben wir uns auch eine Hilfe, damit wir nicht vergessen wie das Script zu bedienen sein wird.
Zunächst schreiben wir uns eine Helfs-Funktion, welche einen Befehl ausführt:
mc_cmd() { screen -S $SCREEN_NAME -p 0 -X stuff "`printf "$*\r"`"; }
Die Bereiche Start, Stop und Restart werden um die folgenden Zeilen ergänzt:
"start") echo -n "Starting minecraft... "; screen -dmS $SCREEN_NAME java -Xmx1536M -Xms64M -jar $SERVER_NAME && echo "OK"; ;; "stop") say "Stoppe in 5 Sekunden."; sleep 5; echo -n "Stopping minecraft... "; mc_cmd stop && echo "OK"; ;; "restart") $0 stop; sleep 5; $0 start; ;;
Zusätzlich bauen wir noch wrapper für save und say ein:
"save-off") mc_cmd save-off && echo "save-oFF."; ;; "save-on") mc_cmd save-on && echo "save-oN."; ;; "save-all") mc_cmd save-all && echo "save-ALL."; ;; "say") say $2; ;;
Zum Schluss die Hilfe:
"--help") echo "Usage: ./run.sh <Command> [<Options>]"; echo ""; echo "Available commands are:"; echo " start Starts the server."; echo " stop Stops the server."; echo " restart Restarts the server."; echo " save-off Turns level saving off."; echo " save-on Turns level saving on."; echo " save-all Saves the level."; echo " say <msg> Prints <msg> to the game chat."; ;;
Nun das Backup-Script, welche den Ordner “world” in einen Tarball mit Timestamp packt. Das Script von oben wird unter ./run.sh aufgerufen.
#!/bin/bash ./run.sh say "[BACKUP] Starte. Speichere Welt..."; ./run.sh save-off; ./run.sh save-all; cp -R world bak_tmp && ./run.sh say "[BACKUP] Gespeichert, komprimiere ..."; ./run.sh save-on; nice -n +5 tar -cf - bak_tmp | nice -n +5 gzip -9 - > world-$(date "+%d-%m-%Y_%H-%M").tar.gz; rm -R bak_tmp; ./run.sh say "[BACKUP] Alles Fertig.";
Nicht vergessen, beiden Scripten ausführungsrechte zu geben (via chmod u+x scriptname.sh). Dann Spaß beim Minecraft-Fernsteuern haben!
Wer rausfindet, wie man prüft ob eine Screen-Sitzung noch läuft darf das gerne in die Kommentare schreiben!

