Gameserver auf RootServer Überwachen und automatisch neu Starten

NoDino
Moin Gemeinde,

da unser CoD1 GameServer auf unserem Root-Server schon das ein oder
andere mal abstürzt, hab ich mir mal gedanken zu einem Überwachungsscript
gemacht.

Das Script wird per Cronjob jede Minute gestartet und überprüft ob der Prozess
von CoD1 noch Aktiv ist und der CoD1 Port 28960 offen ist.

Wenn dieses Script den Server neu startet wird ein Eintrag in ein Logfile gemacht.

Hier das Script:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
#!/bin/bash

UT_LOGFILE=/home/gameserver/cod/log_rs.txt

     if [ "$(ps au | awk '{print $11}' | grep -1 cod_lnxded)" ]; then
           echo "Call of Duty 1 GameServer AKTIV.";
     else
           echo "Call of Duty 1 GameServer INAKTIV."
           /usr/local/bin/cod restart
           echo `date +%Y-%m-%d--%k:%M`" Uhr - GameServer Call of Duty 1 wurde neu gestartet (Prozessfehler)" \ >> $UT_LOGFILE;

     fi

     if [ "$(nmap -sUT -p 28960 localhost | awk '{print $2}' | grep -1 open)" ]; then
           echo "Call of Duity 1 GameServer Port 28960 ist OFEEN.";
     else
           echo "Call of Duty 1 GameServer Port 28960 ist GESCHLOSSEN."
           /usr/local/bin/cod restart
           echo `date +%Y-%m-%d--%k:%M`" Uhr - GameServer Call of Duty 1 wurde neu gestartet (Programm-/Portfehler)" \ >> $UT_LOGFILE;

     fi

exit


Gibt es noch andere oder weitere Möglichkeiten den GameServer zu überwachen?

Das mit dem Port hatte ich mir überlegt weil der Server letztes mal nicht erreichbar war
aber der Prozess noch existierte.

LG NoDino

EDIT:
Ich habe jetzt noch bei der Prozess Überwachung ein EXIT eingebaut damit
beim "Prozessfehler" nicht auch noch die Portabfrage gemacht und ins Logfile geschrieben wird.

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
echo `date +%Y-%m-%d--%k:%M`" Uhr - GameServer UnrealTournament wurde neu gestartet (Prozessfehler)" \ >> $UT_LOGFILE
           exit;

Kelli

Zitat:

Original von NoDino

Gibt es noch andere oder weitere Möglichkeiten den GameServer zu überwachen?


fork
Serverrcon? (per Shell-Zugriff oder Server-Start-Script)
Macht dasselbe - ohne cronjob.

Zitat:

Original von NoDino
Das mit dem Port hatte ich mir überlegt weil der Server letztes mal nicht erreichbar war
aber der Prozess noch existierte.

Hmm. Ich sehe deine Idee dahinter, aber kann mir kein Szenario vorstellen wo der Port vom BS geschlossen wird aber der Prozess noch läuft. Das CoD auf Anfragen nicht reagiert - ok aber der Port sollte dennoch als offen gekennzeichnet sein. In jeden Fall ist nmap overkill, netstat oder lsof tun das selbe. Das was du willst währe aber eigentlich eine richtige Anfrage schicken ob CoD noch auf dem Port antwortet. Kann man vielleicht am einfachsten mit netcat und einer Status Query machen?

Edit, der Link war falsch, zeigt jetzt direkt auf das fork Startscript
NoDino

Zitat:

Original von Kellerkind
Hmm. Ich sehe deine Idee dahinter, aber kann mir kein Szenario vorstellen wo der Port vom BS geschlossen wird aber der Prozess noch läuft. Das CoD auf Anfragen nicht reagiert - ok aber der Port sollte dennoch als offen gekennzeichnet sein. In jeden Fall ist nmap overkill, netstat oder lsof tun das selbe. Das was du willst währe aber eigentlich eine richtige Anfrage schicken ob CoD noch auf dem Port antwortet. Kann man vielleicht am einfachsten mit netcat und einer Status Query machen?

Okay, ...verstehe ...verstehe
Ich werde mich mal mit netcat befassen.
Das scheint der richtige Weg zu sein.

Danke.
NoDino
So ich werde jetzt nmap duch nc / netcat im Script ersetzen.

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
nc -zw1 -u localhost 28960

Ich kann doch im Script ausschließlich mit netcat Prüfen oder?

Wenn auf dem Port keine Antwort kommt spielt es doch keine Rolle ob der Prozess Aktiv ist oder nicht.

Damit sieht das Script jetzt so aus:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#!/bin/bash
UT_LOGFILE=/home/gameserver/cod/log_rs.txt

      if [ "$(nc -zw1 -u localhost 28960 | grep -1 succeeded)" ]; then
           echo "Verbindung zum Call of Duty 1 GameServer Port 28960 GELUNGEN.";
     else
           echo "Verbindung zum Call of Duty 1 GameServer Port 28960 ist FEHLGESCHLAGEN."
           /usr/local/bin/cod restart
           echo `date +%Y-%m-%d--%k:%M`" Uhr - Keine Verbindung zum CoD1 GameServer Port 29860 - Server wurde neu gestartet" \ >> $UT_LOGFILE;
     fi
exit

[Klugscheiß mode on]
Manchmal ist weniger halt mehr. ... Augenzwinkern
[Klugscheiß mode off]

Vielen Dank
Kelli

Zitat:

Original von NoDino
So ich werde jetzt nmap duch nc / netcat im Script ersetzen.

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
nc -zw1 -u localhost 28960

Ich kann doch im Script ausschließlich mit netcat Prüfen oder?

hmmm. Funktioniert das bei dir? Gibt das bei dir succeeded zurück? Bei mir nicht, jedenfalls nicht grepbar. (Debian)

Ich dachte auch eher an sowas

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
printf "\xff\xff\xff\xffgetstatus\n" | nc -uw 1 127.0.0.1 28960


Da kannst du dir dann aussuchen auf was im status du filterst, auf jedenfall ist dann sicher das er noch lebt. So ähnlich hab ich das mal gemacht um sicherzustellen das ein von mir untervermieteter Server auch wirklich nur mit 12 Slots läuft. grep auf maxclients - wird es geändert dann restart. Gemein. Ja. Augen rollen

Für das einfache restarten wenn der Prozess stirbt favorisiere ich aber immernoch die fork methode (Hab oben noch mal den Link editiert, das er direkt auf das Beispiel zeigt) Aber deins ist etwas sicherer, dafür allerdings auch aufwendiger was die Resourcen angeht, (nc muss installiert sein, crontab, query aller X Sekunden...) und langsamer. Mit fork wird er in der Milisekunde neu gestartet wo der Kindprozess stirbt - bei dir nur aller X Cronjob Zeiteinheiten. Aber kreative Idee.
NoDino

Zitat:

Original von Kellerkind
hmmm. Funktioniert das bei dir? Gibt das bei dir succeeded zurück? Bei mir nicht, jedenfalls nicht grepbar. (Debian)

Ja ja, das Funktioniert bei mir. (Fedora Core6)
Ich habs grad nochmal bei einem anderen leeren GameServer getestet.
Server von Hand gekillt ... schwups war er wieder da ... mit Log eintrag.

Aber ich werde mir deine Methode auch nochmal genauer ansehen.


PS: Mehr als 12-Slots = Restart ... Joo gemein grosses Grinsen