Minecraft Munin-Plugin
Ein Munin-Plugin das die Anzahl der Spieler und den RAM-Verbrauch eines Servers anhand des Ports ermittelt.
Wenn der Server am entsprechenden Port nicht läuft, dann wird beim RAM-Verbrauch 0 ausgegeben.
Es gibt zwar schon ein Munin-Plugin für die Anzahl der Benutzer auf einem Server, aber dieses verlangt, dass eine Datei mit den Namen aller Spieler von einem Bukkit-Plugin erstellt wird; dieses Plugin hier funktioniert allein aufgrund des verwendeten TCP-Ports und ohne Änderungen am Minecraft-Server.
Der Code
- minecraft_
#!/bin/bash LC_LANG=C MC_PORT=${0##*_} if [ "$1" = "config" ] then printf 'graph_title Minecraft-Server (Port %s)\n' ${MC_PORT} printf 'graph_vlabel Anzahl\n' printf 'users.label Benutzer\n' printf 'ramusage.label Verwendeter RAM in GiB\n' exit 0 fi PLAYERCOUNT=$(netstat -tn | grep -i ${MC_PORT} | grep ESTABLISHED | wc -l) MC_PID=$(netstat -tlpn | grep ${MC_PORT} | sed -n -e '1p' | awk '{ print $7 }' | cut -d'/' -f1) if [ ! -z "${MC_PID}" ] then #is running MEMORYRSS=$(ps -p ${MC_PID} -o rss | cut -d' ' -f2) MEMGiB=$(echo "scale=2;${MEMORYRSS}/1024/1024" | bc -l) else MEMGiB=0 fi printf "users.value %i\n" "${PLAYERCOUNT}" printf "ramusage.value %3.2f\n" "${MEMGiB}"
Das sudo für netstat -tlpn ist notwendig, weil ein normaler Nutzer (Munin-Plugins werden immer als Benutzer nobody ausgeführt) nicht die Zuordnung zu sehen bekommt, welcher Port welcher PID eines anderen Benutzers gehört. Wir brauchen aber die PID um an den Speicherverbrauch zu kommen.
Funktionsweise
Zuerst werden mit netstat alle TCP-Verbindungen zum TCP-Port des Minecraft-Servers gezählt.
Dann wird mit Hilfe von netstat und dem Port des Minecraft-Servers, auf dem auf Verbindungen gelauscht wird die PID des Minecraft-Servers ermittelt und davon dann mittels ps der verbrauchte RAM ermittelt.
Installation
Man kopiert die Datei z.B. nach /usr/local/bin und macht sie ausführbar:
# chmod a+x /usr/local/bin/minecraft_
Da man für die Ausführung des netstat-Befehls root-Rechte benötigt, muss man die Munin-Node-Konfiguration unter „/etc/munin/plugin-conf.d/munin-node“ anpassen und folgenden Abschnitt einfügen:
[minecraft_*] user root
Die root-Rechte sind notwendig, damit man Zugriff darauf hat, welches Programm zu welcher Verbindung gehört.
Würde man sudo nicht verwenden, wuerde das hier in der Konsole stehen:
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
Der Benutzer könnte dann nicht sehen, welcher Prozess hinter der Verbindung steht.
Man muss folgendes in die /etc/sudoers eintragen:
nobody ALL=(root) NOPASSWD:/bin/netstat -tlpn
Zusätzlich muss man diese Zeile ändern und sudo einfügen:
MC_PID=$(sudo netstat -tlpn | grep ${MC_PORT} | sed -n -e '1p' | awk '{ print $7 }' | cut -d'/' -f1)
Dann wechselt man ins Verzeichnis /etc/munin/plugins und verlinkt das Script;
z.B. für einen Server der auf Port 5555 läuft:
# cd /etc/munin/plugins # ln -s /usr/local/bin/minecraft_ minecraft_5555
Nach einem Restart von Munin sollte nun alles funktionieren :)
Ergebnis
Die Grafiken (nicht live) schauen dann so aus (für unseren kaguBe-Survival):

Danke
An nifares, der mich auf die Idee gebracht hat, das über die Ports mit netstat zu machen.
