====== Watchdog für HL2-Server ======
Sehr oft kommt es vor, dass unter Linux Source-Server durch Plugins hängen bleiben. Der Prozess läuft zwar, aber der Server antwortet nicht mehr. Das ist besonders ärgerlich, da dieses Problem sporadisch auftreten kann und der Admin meistens zu diesem Zeitpunkt nicht erreichbar ist. Der Server kann bei so einem Fehler auch nicht per Rcon neugestartet werden. Admins mit einem Root-Server können mit Hilfe von [[http://www.qstat.org|Qstat]], einem kleinen Script und einem Cronjob eine wiederkehrende Abfrage für die Server erstellen und diese bei einem Timeout zu beenden.\\
**Das Script wurde noch nicht ausgiebig getestet**
===== Voraussetzungen =====
* Linux
* [[http://www.qstat.org|Qstat]]
* lsof(([[http://en.wikipedia.org/wiki/Lsof]])) - kann unter Debian mit ''apt-get update && apt-get install lsof'' installiert werden
* make, gcc
===== Qstat compilieren =====
Das Programm [[http://www.qstat.org|Qstat]], welches zum Abfragen des Server verwendet wird, muss für Linux zuerst compiliert werden, da es nicht als ausführbare Binärdatei vorliegt. Das Archiv, kann bei [[http://www.qstat.org/downloads/]] heruntergeladen werden.\\
- Quellcode herunterladen. Es kann auch der DL-Link von SourceForge kopiert werden, und dann mittels wget auf dem Root-Server direkt heruntergeladen werden.
- Archiv entpacken: tar -xzf qstat-2.11.tar.gz
- Programm compilieren: cd qstat-2.11
./configure
make
- Das compilierte Programm in ein anderes Verzeichnis verschieben: mkdir ../qstat
mv qstat ../qstat/
- Programm testen: cd ../qstat
./qstat -a2s serverip:port
===== Shell-Script =====
Mit diesem Shell-Script werden aus der Datei ''watchdog_servers'' Adressen zu HL2-Gameservern abgearbeitet. In der Datei muss pro Zeile IP:PORT des zu scannenden Servers eingetragen werden.\\
Hier ein Beispiel (watchdog_servers):
123.123.123:27015
123.123.123:27016
Das Script arbeitet Zeile für Zeile ab. Zuerst wird überprüft ob die Datei ''watchdog_servers'' vorhanden ist. Falls nicht, bricht das Script ab. Ist die Datei vorhanden, wird in einer Schleife die IP mit Port aus der Liste ausgelesen. Danach wird die Prozessid mithilfe von ''lsof'' in der Variable'' $pid'' gespeichert. Falls der Server nicht vorhanden ist((IP:PORT ist nicht belegt)) endet das Script. In diesem Fall läuft der Server einfach nicht. Wenn eine PID ausgelesen werden kann, speichert das Script die Ausgabe von qstat in der Variable $response. In diesem Fall ist nur der Inhalt "no response" oder "DOWN" von Bedeutung. Trifft eines der beiden Fällen zu, ist der Server hängen geblieben. Der Prozess, dessen PID in der Variable $pid gespeichert wurde, wird dann mittels ''kill $pid'' beendet. Damit der Server automatisch neustartet, muss er entweder zuvor mittels ''-autoupdate'' gestartet worden sein oder ein anderes Script muss an dieser Stelle einspringen, um den Server wieder zu starten.\\ \\
watchdog_hl2.sh:
#!/bin/bash
function init {
if [ -z "`which lsof`" ]; then echo "lsof isn't installed"; return 1; fi
if [ ! -f ~/qstat ]; then echo "qstat isn't installed"; return 1; fi
if [ ! -f ~/watchdog_servers ]; then echo "~/watchdog_servers doesn't exists"; return 1; fi
return 0
}
function not_response {
~/qstat -a2s $1 -nh -timeout 20 | egrep -q 'no response|DOWN'
}
function get_pid {
lsof -i 4udp@${1} | cut -d ' ' -f2 | tail -n 1
}
function parse_list {
cat watchdog_servers | tr -d \r
}
function kill_dead_server {
echo -en "Testing -> $1\t\t\t"
if not_response $1; then
pid=`get_pid $1`
[[ -z "$pid" ]] && echo "[Not Running]"
[[ ! -z "$pid" ]] && kill $pid && echo "[Restarted]"
else
echo "[OK]"
fi
}
init || exit
for server in `parse_list`; do
kill_dead_server $server
done
Das Script kann auch {{:tutorial:server:watchdog_hl2.sh|hier}} heruntergeladen werden.
===== Cronjob einrichten =====
Für jeden User unter Linux lassen sich Cronjobs einrichten, die zu bestimmten Zeitpunkten oder in bestimmten Abständen Befehle ausführen. Mit dem Befehl ''crontab -e'' können die Cronjobs des aktuellen angemeldeten Users bearbeitet werden. Wie ein Cronjob aufgebaut ist, kann in dem Wikipedia-Artikel [[wpde>Cronjob]] nachgelesen werden.\\
Das Script kann z.B. jede Minute aufgerufen werden:\\
*/1 * * * * ~/watchdog_hl2.sh &>/dev/null
Die letzte Zeile muss immer leer bleiben, damit die Cronjobs auch ausgeführt werden.