65 lines
3.6 KiB
Markdown
65 lines
3.6 KiB
Markdown
## Auto Shutdown
|
|
|
|
Fährt den Minecraft Server automatisch nach 14 Tagen leerlauf herunter.
|
|
|
|
* lp_stamp: Timestamp an dem das letzte mal ein Spieler gesehen wurde
|
|
* lp_shutdown: Flag die dem Serverskript mitteilt, warum der Server heruntergefahren wurde
|
|
* 0: Normaler täglicher Shutdown, bzw. unerwarteter Shutdown -> automatischer Neustart
|
|
* 1: Shutdown wegen leerstand -> kein automatischer Neustart, warten auf Verbindung
|
|
|
|
### Erkennung einer Minecraft Verbindung
|
|
|
|
Theoretisch könnte man mit `nc -l 25500 -c :`, aber dadurch startet sich der Server durch *jede* Verbindung.
|
|
|
|
Besser ist es, wenn man sich das Packet vorher anschaut, und nur den Server neu startet, wenn wirklich jemand in Minecraft sich versucht zu verbinden.
|
|
|
|
Das Packet sieht (zumindest mit Valhelsia) ungefähr so aus:
|
|
|
|
* Automatischer Verbindungstest von Minecraft wenn man das Multiplayer Menu öffnet:
|
|
```
|
|
^X^@M-r^E^Q[SERVERNAME]^@FML2^@cM-^\^A^A^@
|
|
```
|
|
|
|
* Wenn man auf "Connect" klickt:
|
|
```
|
|
^X^@M-r^E^Q[SERVERNAME]^@FML2^@cM-^\^B
|
|
^@^H[SPIELERNAME]
|
|
```
|
|
|
|
Auf eine legitime Verbindung zu warten kann dann z.B. so aussehen:
|
|
```bash
|
|
mcconn=0
|
|
until [ $mcconn -ne 0 ]; do
|
|
mcconn=$(nc -l 25500 | cat -v | grep -cF '^@cM-^\^B')
|
|
if [ $mcconn -eq 0 ]; then
|
|
echo "Something connected, but it doesn't look like a minecraft connection"
|
|
else
|
|
echo "Someone tried to connect to the minecraft server, starting..."
|
|
fi
|
|
done
|
|
```
|
|
|
|
Ein vollständigeres Regex, dass auf eine korrekte Verbindung prüft sieht so aus, doch leider scheint das nicht in grep zu funktionieren:
|
|
```regex
|
|
^\^X\^@M-r\^E\^Q[a-zA-Z0-9\.]+\^@[a-zA-Z0-9]+\^@cM-\^\\\^B\n\^@\^H[a-zA-Z0-9]+
|
|
```
|
|
|
|
### Server Start Skript
|
|
|
|
Beim Starten des Servers wird eine große Menge an Parametern übergeben:
|
|
|
|
* `-Xms20G -Xmx20G`: Wie viel Heap am Start und Maximal reserviert wird; sehr großzügig gewählt
|
|
* `-javaagent:jolokia-jvm-1.6.2-agent.jar`: Jolokia Agent, genutzt um Monitoringdaten aufzunehmen
|
|
* `-XX:+UnlockExperimentalVMOptions`: Schaltet ein paar experimentelle Optionen frei
|
|
* `-XX:+UseG1GC`: Welcher Garbage Collection Algorithmus genutzt wird; da Minecraft nur auf Java 8 läuft ist leider G1GC die beste Option
|
|
* `-XX:MaxGCPauseMillis=100`: Sagt dem GC dass es versuchen soll den Hauptthread nicht mehr als 100ms zu pausieren; ist keine Garantie!
|
|
* `-XX:+DisableExplicitGC`: Sorgt dafür das explizite GC Aufrufe ignoriert werden, da dass jedesmal ein Full GC ist und Modder das ab und zu (fälschlicherweise) verwenden
|
|
* `-XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=50 -XX:G1ReservePercent=20`: Setzt ein paar Größen für die verschiedenen "Bereiche" des GC Algorithmus; werden so empfohlen, kA was das genau macht
|
|
* `-XX:ConcGCThreads=2 -XX:ParallelGCThreads=4`: Threads die für die verschiedenen Phasen der GC verwendet werden; können gut auf hohe Werte eingestellt werdn, da MC praktisch nur einen Thread nutzt
|
|
* `-XX:InitiatingHeapOccupancyPercent=25`: Ab wann ein concurrent GC Cyclus gestartet wird in % vom Max Heap; niedrig eingestellt, da Minecraft sonst viel zu spät damit anfängt
|
|
* `-XX:+AlwaysPreTouch`: "Berührt" den Heap Speicher beim Starten der JVM
|
|
* `-Xloggc:gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=1M`: Aktiviert das Logging der GC und richtet Logrotation ein
|
|
|
|
## Update Index
|
|
|
|
Kleines Skript, dass die html Seite die auf dem http(s) Port des Minecraft Servers angezeigt wird updated. |