ServerChecker
Od HLDS.pl
Spis treści |
Opis
ServerChecker – Skrypt napisany w Perl'u, dzięki któremu osiągniemy większy uptime serwera ;).
Generalnie chodzi o to, że dzięki temu, gdy serwer przestanie odpowiadać (zawiesi się) to skrypt wykona inny odpowiedni skrypt, bądź inną komendę odpowiedzialną za restart serwera gry, bez interwencji administratora.
Bardzo przydatne, jeżeli testujemy różne dodatki, które mają wycieki pamięci, a chcemy, aby ludzie mogli grać na serwerze bez większych przeszkód.
Linki
- Oficjalna strona twórców skryptu, czyli klanu [Dumb] - znajdziecie tam nowszą wersję pod serwery Source i nie tylko - (wersaj pod Windows).
- Oficjalna wersja w PERL dla linuxów, autorstwa [DUMB]SGR.
- Protokół Source - do komunikacji rcon oraz sprawdzania statusu serwera (serwer query)
Skrypt
#!/usr/bin/perl -X use Socket; #----------------------------------------------------------- # Konfiguracja (Do ustawienia według opisu) #----------------------------------------------------------- my $host = "x.x.x.x"; # Adres IP serwera do sprawdzania (To jest ten zbindowany). my $port = "27015"; # Port serwera, na którym chodzi. use constant CHECKEVERY => 90; # Jak często sprawdzać serwer ? (Tutaj ustawiono co 90 sekund). use constant TIMEOUT => 20; # Jak długo czekać na jego odpowiedź zanim go zrestartujemy. # Poniżej podaj ścieżkę do skryptu uruchamiającego/restartującego serwer. # Oczywiście może to być także zwykła komenda zawierające odpowiednie opcje. my $cmd = "/home/hlds_l/scripts/hlds restart"; #----------------------------------------------------------- # Nie edytuj tego poniżej, chyba, że wiesz co robisz :) #----------------------------------------------------------- my $MAXLEN = 128; my $msg="\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00"; my $RET = "NONE!"; $SIG{ALRM} = sub { &TimeOut }; &Start; sub CheckServer { my $ipaddr = inet_aton($host); my $portaddr = sockaddr_in($port, $ipaddr); $RET = "NONE!"; socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp")) or die "socket: $!"; send(SOCKET, $msg, 0, $portaddr) == length($msg) or die "Error Sending Query.\n"; alarm(TIMEOUT); recv(SOCKET, $RET, $MAXLEN, 0); close SOCKET; sleep(CHECKEVERY); } sub Start { while (1) { &CheckServer; } } sub TimeOut { if ($RET eq "NONE!") { print "SERVER DOWN, RESTARTING!\n"; $STARTSERV = `/usr/bin/perl -w $cmd`; print $STARTSERV . "\n"; } sleep(CHECKEVERY); close SOCKET; }
And again PawelS saves the world ;)