Zastanawiam się jak zrobić takie coś?
Skrypt/program sprawdza co XX czasu, czy dany proces istnieje, jeśli nie, uruchamia go w programie screen. Czytałem o tym kiedyś ale za ,,cukierka'' nie mogę sobie przypomnieć nazwy.
Chcę tego używać do automatyczne uruchamiania serwerów Counter-Strike po zaniku ich działania.
Pozdrawiam.
Edycja:
Znalazłem coś takiego
Kod: Zaznacz cały
#!/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;
}
http://hlds.pl/ServerChecker tu opis.
Edycja:2
Zrobiłem tak, skrypt status, czyli uruchamia skrypt restart, czyli:
Kod: Zaznacz cały
NAME=Game_Server_1 EXECUTABLE=./game_server PARAMS="+set dedicated 2 +set net_ip 192.168.1. +set net_port 27733 +set sv_punkbuster 1 +set fs_homepath /path/to/server/ +exec server.cfg +map_rotate" DIR=/path/to/server/ case "$1" in start) if [[ `screen -ls |grep $NAME` ]] then echo "Error: $NAME is already running, use '$0 stop' to stop it" else cd $DIR screen -dmS $NAME $EXECUTABLE $PARAMS echo "$NAME was started." fi ;; stop) if [[ `screen -ls |grep $NAME` ]] then kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'` echo "$NAME was stopped" else echo "Error: $NAME isn't currently running" fi ;; restart) if [[ `screen -ls |grep $NAME` ]] then kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'` fi cd $DIR screen -dmS $NAME $EXECUTABLE $PARAMS echo "$NAME was restarted" ;; status) if [[ `screen -ls |grep $NAME` ]] then echo "$NAME is currently running" else echo "$NAME is NOT running" fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
Problem jest z tym pierwszym, nadałem mu prawa dostępu, jak chcę uruchomić to wyświetla
Kod: Zaznacz cały
./status: line 2: use: command not found
./status: line 8: my: command not found
./status: line 9: my: command not found
./status: line 10: use: command not found
./status: line 11: use: command not found
./status: line 16: my: command not found
./status: line 22: my: command not found
./status: line 23: my: command not found
./status: line 24: my: command not found
./status: line 25: {ALRM}: command not found
./status: line 25: TimeOut: command not found
./status: line 26: syntax error near unexpected token `&'
./status: line 26: ` &Start;'