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 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
apt-get update && apt-get install lsof
installiert werden
Das Programm 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.
tar -xzf qstat-2.11.tar.gz
cd qstat-2.11 ./configure make
mkdir ../qstat mv qstat ../qstat/
cd ../qstat ./qstat -a2s serverip:port
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 ist2) 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 hier heruntergeladen werden.
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 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.