ServerChecker

Od HLDS.pl
Skocz do: nawigacji, wyszukiwania

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.

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 ;)

Zobacz też

Linki

  • Protokół Source - do komunikacji rcon oraz sprawdzania statusu serwera (serwer query)
Osobiste
Przestrzenie nazw
Warianty
Działania
HLDS.pl - Menu:
Inne
IRC
Inne sekcje:
Znajomi:
Narzędzia