Mit diesem Shell-Script kann man einen oder mehrere Minecraft-Server steuern, starten, beenden, neustarten, (inkrementelle) Backups erstellen, Befehle an den Server senden, usw.
Dabei ist es auch möglich, unter demselben Benutzeraccount mehrere unabhängige Server laufen zu lassen, da Einstellungen und Screen-Sessions Minecraft-Server-basiert sind, nicht Benutzer-basiert.
Wir verwenden dieses Script für unsere Minecraft-Server.
Die aktuelle Test-Version (master) hat Support für tmux :) Es gibt jedoch noch keine ordentliche Methode, an die PID des Servers zu kommen – tmux hilft hier nicht, da es nur von der ersten Session einen Prozess in der Liste zu geben scheint… (?). Außerdem ist das Handling von tmux und Prozessliste etwas anders als bei screen. Beim nächsten Mal werde ich auch einen eigenen Branch für sowas machen :)
Man sollte deshalb tmux maximal einmal pro Benutzer verwenden, sonst gibt es Probleme. Mit Screen geht alles wie gewohnt.
Die aktuelle Version gibt es bei Github zum Herunterladen:
https://github.com/Natenom/mcontrol/tags.
Dieses Script basiert auf Server_startup_script version 0.3.2 2011-01-27; hat mittlerweile aber nicht mehr viel gemeinsam.
Ich habe es sehr stark überarbeitet, verschlankt und an eigene Bedürfnisse angepasst. Z. B. war das Original nicht in der Lage, mehrere Server zu verwalten und war ziemlich grausig gemacht; statt z. B. Funktionen zu verwenden wurde derselbe Code mehrmals geschrieben.
Lizenz
Wie auch das Original liegt dieses abgeleitete Script unter der Lizenz „CC Attribution-NonCommercial-ShareAlike 3.0 Unported“.
Sollte der Minecraft-Server bei restart/stop nicht mehr reagieren, so wird mittels kill trotzdem gewährleistet, dass er beendet wird.
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser1/server2 restart craftbukkit-1.1-R4-SNAPSHOT.jar is running... stopping. craftbukkit-1.1-R4-SNAPSHOT.jar is not running... starting. craftbukkit-1.1-R4-SNAPSHOT.jar is now running.
Jeder Server wird in einer eigenen Screen-Session gestartet die dem jeweiligen Benutzer gehört. Trotzdem kann man das Script auch als root ausführen.
Nützlich, wenn der Server in einer Ramdisk läuft; damit kann man ihn beim täglichen Neustart direkt von der Ramdisk auf die Festplatte des Servers synchronisieren lassen.
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser1/server2 restartandsync craftbukkit.jar is running... stopping. Server is still running, giving 20 seconds to shutdown. Waiting... Server managed to shutdown cleanly. Your Server is using a ramdisk, don't forget to do a ramd-to-s before complete server shutdown... Starting rsync, from ramdisk to disk... rsync -a --delete "/home/minecraft/mcuser1/server2/" "/home/minecraft/mcuser1/server2_prerun" craftbukkit.jar is not running... starting. craftbukkit.jar is now running.
Gibt aus ob der Server läuft oder nicht.
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser1/server2 status craftbukkit-1.1-R4-SNAPSHOT.jar is running.
Befehle an einen Server senden, z. B. say oder administrative Dinge
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser1/server2 sc "say Hallo"
Weitere Informationen siehe unter Inkrementelle Backups in mcontrol.
Bei Verwendung von BACKUPSYSTEM=rdiff wird auch sichergestellt, dass das Quota eingehalten wird; dieses kann in der Konfiguration jedes Servers hinterlegt werden (BACKUP_QUOTA_MiB).
Hier die Ausgabe auf der Konsole beim Aufruf des Backups unter Verwendung von rdiff-backup:
mcuser@server:~$ mcontrol.sh /etc/minecraft-server/mcuser1/server2 backup craftbukkit-1.1-R4-SNAPSHOT.jar is running... suspending saves Backing up mc-server-mcuser1-server2. Total backup size (2051 MiB) is less or equal quota (5000 MiB). craftbukkit-1.1-R4-SNAPSHOT.jar is running... re-enabling saves
Sync-to-Ramdisk. Synchronisiert den Inhalt von SERVERDIR_PRERUN nach SERVERDIR.
Funktioniert nur, wenn der Server aus ist.
Sync-from-Ramdisk. Synchronisiert den Inhalt von SERVERDIR nach SERVERDIR_PRERUN.
Funktioniert nur, wenn der Server aus ist.
Funktioniert nur bei BACKUPSYSTEM=rdiff.
Zeigt eine Liste der ikrementellen Backups des Server an.
Beispiel:
mcuser@server:~$ mcontrol.sh /etc/minecraft-server/mcuser1/server2 backup Backups for server "server2" Found 230 increments: increments.2012-02-18T23:00:12+01:00.dir Sat Feb 18 23:00:12 2012 increments.2012-02-18T23:30:13+01:00.dir Sat Feb 18 23:30:13 2012 increments.2012-02-19T00:00:12+01:00.dir Sun Feb 19 00:00:12 2012 increments.2012-02-19T00:30:15+01:00.dir Sun Feb 19 00:30:15 2012 increments.2012-02-19T01:00:15+01:00.dir Sun Feb 19 01:00:15 2012 ... Current mirror: Thu Feb 23 16:30:11 2012 Time Size Cumulative size ----------------------------------------------------------------------------- Thu Feb 23 16:30:11 2012 379 MB 379 MB (current mirror) Thu Feb 23 16:00:12 2012 16.5 MB 396 MB Thu Feb 23 15:39:46 2012 4.29 MB 400 MB Thu Feb 23 15:30:12 2012 2.37 MB 402 MB ...
Ein eigenes Plugin für genau diese Art von Lottery gibt es unter MinecraftLottery.
Der Benutzer bekommt eine zufällige Anzahl x eines Gegenstands y.
Die notwendigen ID-Listen sind bereits im Download enthalten:
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser1/server2 lottery yourname Name: yourname Anzahl: 6 Bezeichnung(ID): SEEDS(295) Done.
Man erhält die PID (Prozess ID) des Servers.
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser1/server2 status 96821
Dieses muss immer das letzte Argument sein; es schaltet das tracing der Shell ein (set -x).
Beispiel:
mcontrol.sh /etc/minecraft-server/mcuser/server2 status -debug + ps aux + grep 'mc-server-mcuser1-server2 ' + grep SCREEN + grep -v grep + return 0 + echo 'craftbukkit.jar is running.' craftbukkit.jar is running. + exit 0
Wo diese Datei liegt ist erstmal egal; jedoch sollte der Benutzer keine Schreibrechte darauf haben, damit er keinen Scheiss bauen kann, wie z. B. weitere Backupverzeichnisse hinzufügen um die Platte zu belasten, BackupQuota zu erhöhen, usw.
Z. B. für den oben aufgeführten mcuser1 und dessen server2 die Datei /etc/minecraft-server/mcuser1/server2:
Siehe unter https://github.com/Natenom/mcontrol/blob/master/server2.cfg.
Siehe unter Inkrementelle Backups in mcontrol.
Siehe unter Server in Ramdisk (tmpfs) laufen lassen.
Name der Datei ist einstellbar in der Konfiguration pro Server.
Variable ist DONT_START.
Überprüft wird die Existenz der Datei nur bei der Funktion mc_start().
Beim Aufruf ohne weitere Angaben:
Usage: mcontrol.sh SETTINGS_FILE COMMAND [ARGUMENT] COMMANDS start Start the server. stop Stop the server. restart Restart the server. restartandsync Restart the server and do a sync from ramdisk to disk after stopping and before starting the server. backup Backup the server. s-to-ramd Sync server contents from SERVERDIR_PRERUN("") to SERVERDIR("") s-from-ramd Sync server contents from SERVERDIR("") to SERVERDIR_PRERUN("") listbackups List current incremental backups (only available for BACKUPSYSTEM="rdiff"). status Prints current status of the server (online/offline) sendcommand|sc|c Send command to the server given as [ARGUMENT] lottery <playername> Gives a player a random count of a random item. (Player must have a free inventory slot.) pid Get pid of a server process. -debug Must be the last argument. Enables shell trace output (set -x) EXAMPLES Send a message to all players on the server: mcontrol.sh SETTINGS_FILE sendcommand "say We are watching you :P" Give me some golden apples: mcontrol.sh /etc/minecraft-server/userx/serverx sendcommand "give yourname 322 100"
mcontrol mag es nicht wenn man /proc mit hidepid > 0 gemountet hat
Als Beispiel eine Verzeichnisstruktur der Minecraft-Server/Benutzer:
/home/minecraft-server/ user1/ server1/... server2/... user2/ server1/... server2/...