Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
tutorial:server:response_check [2009/05/02 17:07] DeaD_EyE angelegt |
tutorial:server:response_check [2010/08/22 12:31] (aktuell) DeaD_EyE Fehler im Script behoben, Datei aktualisiert |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Watchdog für HL2-Server ====== | ====== 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. | + | 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 ===== | ===== Voraussetzungen ===== | ||
* Linux | * Linux | ||
Zeile 21: | Zeile 23: | ||
</code> | </code> | ||
===== Shell-Script ===== | ===== Shell-Script ===== | ||
- | Mit diesem Shell-Script werden aus der Datei ''servers.lst'' Adressen zu HL2-Gameservern abgearbeitet. In der Datei muss pro Zeile IP:PORT des zu scannenden Servers eingetragen werden.\\ | + | 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 (servers.lst): | + | Hier ein Beispiel (watchdog_servers): |
- | <code>sourceserver.info:27015 | + | <code>123.123.123:27015 |
- | 123.123.123:27015 | + | |
123.123.123:27016</code> | 123.123.123:27016</code> | ||
- | Das Script arbeitet Zeile für Zeile ab. Zuerst wird überprüft ob die Datei ''servers.lst'' 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.\\ \\ | + | 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.\\ \\ |
- | scanhl2.sh: | + | watchdog_hl2.sh: |
<code bash>#!/bin/bash | <code bash>#!/bin/bash | ||
- | if [ ! -f servers.lst ]; then echo "Missing file servers.lst" && exit; fi | + | |
- | for server in $(cat servers.lst); do | + | function init { |
- | pid=$(lsof -i 4udp@$server | cut -d ' ' -f 2 | tail -n 1) | + | if [ -z "`which lsof`" ]; then echo "lsof isn't installed"; return 1; fi |
- | if [ ! -z "$pid" ]; then | + | if [ ! -f ~/qstat ]; then echo "qstat isn't installed"; return 1; fi |
- | response=$(./qstat -a2s $server -nh | tr -s ' ' | cut -d ' ' -f 2-) | + | if [ ! -f ~/watchdog_servers ]; then echo "~/watchdog_servers doesn't exists"; return 1; fi |
- | if [ "$response" = "no response" -o "$response" = "DOWN" ]; then | + | return 0 |
- | kill $pid | + | } |
- | fi | + | |
- | fi | + | function not_response { |
- | done</code> | + | ~/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 | ||
+ | </code> | ||
+ | Das Script kann auch {{:tutorial:server:watchdog_hl2.sh|hier}} heruntergeladen werden. | ||
===== Cronjob einrichten ===== | ===== 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.\\ | 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:\\ | Das Script kann z.B. jede Minute aufgerufen werden:\\ | ||
- | <code>*/01 * * * * /home/userverzeichnis/qstat/qstat</code> | + | <code>*/1 * * * * ~/watchdog_hl2.sh &>/dev/null |
+ | |||
+ | </code> | ||
Die letzte Zeile muss immer leer bleiben, damit die Cronjobs auch ausgeführt werden. | Die letzte Zeile muss immer leer bleiben, damit die Cronjobs auch ausgeführt werden. |