Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorial:server:response_check

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 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
  • lsof1) - kann unter Debian mit apt-get update && apt-get install lsof installiert werden
  • make, gcc

Qstat compilieren

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.

  1. Quellcode herunterladen. Es kann auch der DL-Link von SourceForge kopiert werden, und dann mittels wget auf dem Root-Server direkt heruntergeladen werden.
  2. Archiv entpacken:
    tar -xzf qstat-2.11.tar.gz
  3. Programm compilieren:
    cd qstat-2.11
    ./configure
    make
  4. Das compilierte Programm in ein anderes Verzeichnis verschieben:
    mkdir ../qstat
    mv qstat ../qstat/
  5. 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 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.

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 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.

2) IP:PORT ist nicht belegt
tutorial/server/response_check.txt · Zuletzt geändert: 2010/08/22 12:31 von DeaD_EyE