Game server status checker
Spis treści |
Opis
UWAGA ten artykuł jest wyłącznie pod Linuksa |
Skrypt bash dla linuksa do sprawadzania czy serwer gry nadal dziala na tym samym hoscie na ktorym zostal uruchomiony skryp sprwdzajacy. Do uzycia w crontabie.
Skrypt sprawdza wylacznie jeden serwer, czyli jka masz 3 serwery gry to musisz miec 3 rozne wpisy w crontabie do wywolywania 3 roznych skryptow rozniacych sie sekcja konfiguracyjna dla kazdego serwera osobno.
Stosuje go aby sprwawdzac czy mi sie nie zwiesza albo nie wyladowywuje mapy serwer ETQW dzialajacy na testowym modzie Dusk Mod.Problem jest taki ze serwer dziala ale:
- moze wpasc w petle i zzera 100%cpu
- moze cos sie skitrac i wyladowac mape
W takich przypadkach serwer nie odpowiada na sprawdzenie statusu programem Qstat, a inne skrypty sprwadzajace czy process dziala zwrwacaja info ze serwer dziala... no ale co z tego jak nikt sie nie moze do niego polaczyc.
skrypt po modyfikacji konfiguracyjnej czesci dziala niezaleznie od gry.
Wymagania
- wymaga Qstat, najlepiej skompilowanego z svn
- bash (shell)
- mozliwosc listowania przez usera na ktorym dzialaja serwery gry do listowania procesow, przynajmniej wlasnych, wiekszosc ma taka opcje
Opcje
- sprawdzanie serwer po ip/porcie, jednoznacznie definuje serwer na lokalnej maszynie
- liczba sprawdzen statusu serwera, przewaznie 3 sprawdzenia starczaja
- przedzial czasu w jakim serwer moze nie odpowiedziec, np jak serwer zmiena mape to nie odpowie ale nie powinnismy go ubijac, czas ten jest zalezny od sprzetowej wydajnosci serwera jak i systemu ladowania mapy przez serwer gry - sa gry gdzie nawet na super silnych maszynach ladowanie mapy trwa wieki
- opcja czyszczenia pliku PID serwera gry, jak nie wiesz co to to ustaw na ""
- opcja logowania do pliku kiedy serwer gry zostal ubity w formacie DATA,IP:PORT,PID,ILE_SPRAWDZEN (wlasciwie to ostatnie mozna olac)
Skrypt
# game server status checker by _KaszpiR_ kaszpir@gmail.com http://hlds.pl # version 0.2 beta, use at your own risk # License: Free of use, GPL http://www.gnu.org/copyleft/gpl.html # Requirements # - qstat, to check game server status, get svn version http://sourceforge.net/projects/qstat/ # - let (bash command, usually if you got bash then you got it aswell) # - user ability to list of its own processess, usually its enabled # configuration below ########################################################################## QSTAT="/home/etqw/bin/qstat"; # path to qstat Q_TYPE="-etqws"; # game server type, see qstat --help for more info Q_SERVER_IP="87.98.234.166"; # game server ip, use ip only Q_SERVER_PORT="27733"; # game server port RETRY_TIME=10; # time in seconds to check server status RETRY_MAX=3; # how many times server can be down, set it high to avoid killing server on map change PID_FILE="/home/etqw/etqw/.dusk-27733/etqw.pid"; # server pid file, check it in server init script, change to empty if unsure DATE_FORMAT="%Y-%m-%d %H:%M"; # date format, man date for more details, for informational purposes LOGFILE="/home/etqw/etqw/.dusk-27744/dusk-check.log"; # where to output messahes about killed server ########################################################################## # end of config DATE_NOW=`date +"$DATE_FORMAT"`; echo $DATE_NOW echo "Checking server" echo " IP: $Q_SERVER_IP" echo "Port: $Q_SERVER_PORT" echo "Type: $Q_TYPE" # qstat list only servers that are up COUNTER=0 while [ $COUNTER -lt $RETRY_MAX ]; do echo -n "Server check $COUNTER/$RETRY_MAX: " if [ `$QSTAT $Q_TYPE $Q_SERVER_IP:$Q_SERVER_PORT -nh -u|wc -l` -eq 0 ]; then echo "down"; let COUNTER=COUNTER+1; sleep $RETRY_TIME else echo "up"; echo "We do nothing, exiting."; exit; fi done echo "Looks like server is not responding, trying to kill its process..." SERVER_PID=`ps aux | grep -v grep | grep $Q_SERVER_IP | grep $Q_SERVER_PORT | awk '{print $2}'` kill -9 $SERVER_PID >/dev/null 2>&1 if [ "$?" == "0" ]; then echo "$SERVER_PID killed." if [ -f $PID_FILE ]; then rm -f $PID_FILE; fi if [ -n $LOGFILE ]; then echo "$DATE_NOW,$Q_SERVER_IP:$Q_SERVER_PORT,$SERVER_PID,$COUNTER" >> $LOGFILE fi else echo "$SERVER_PID not found as running process, abroting." fi # end of file