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

Coding-Tipps für Munin bzw. für die Shell gibt es hier: http://munin-monitoring.org/wiki/ShellPlugins.

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.

Alternativ kann man auch sudo verwenden; dies ist aber nicht so schön…
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.


Navigation
Datenschutz in diesem Wiki
Wir speichern nicht...

Lizenz dieses Wikis



Soweit nicht anders angegeben stehen die Inhalte dieses Wikis unter der Creative Commons Lizenz by-sa.

Informationen zur Weiterverwendung der Inhalte dieses Wikis