Скрипт рестарта сервера при потере порта или зависании. BASH

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Не знаю почему, но с некой периодичностью некоторые мои сервера крашатся с зависанием намертво или теряют порт. Пришлось наваять такой быдлокод скрипт для авторестарта серваков с уведомлением на email

Вот код.

PHP:
#!/bin/bash

rst ()
{
num=$(( $1 - 27014 ))
/home/tf2/tf.sh $num restart ## Запускает скрипт сотпа/старта сервера
case $2 in
        idle)
        echo -e "Subject: $(awk '/hostname / && !/\// { sub($1." ",""); print $0 }' /home/tf2/srv_files/tf/cfg/server.cfg$num) restarted at $(date +%d.%m.%y-%H:%M:%S)\n $(tail -n 30 /tmp/server${num}/screenlog.0)" | \
        sendmail -vf email@mail.ru
        ;;

        badport)
        echo -e "Subject: $(awk '/hostname / && !/\// { sub($1." ",""); print $0 }' /home/tf2/srv_files/tf/cfg/server.cfg$num) restarted at $(date +%d.%m.%y-%H:%M:%S). Bad port!" | \
        sendmail -vf email@mail.ru
        ;;
esac
}

while true; do # Always

for port in {27015..27020}; do
        proc=
        portn=
        state=
        i=
        k=
        while [ -z $proc ]; do
                proc=$(ps ax | awk '$3 ~ /l/ && /'$port'/ {print $1}')
                i=$(( $i + 1))
                sleep 10
                if [ $i == 3 ]; then
                        rst $port idle
                        state=1
                        i=
                fi
        done
        while [ -z $portn ] && [ -z $state ]; do
                portn=$(netstat -nap 2>/dev/null | awk '/'$proc'/ && /LISTEN/ {print $4}' | cut -d : -f 2)
                k=$(( $k + 1 ))
                sleep 10
                if [ $k == 3 ]; then
                        rst $port idle
                        state=2
                        k=
                fi
echo "$proc-$port-$portn"

        done
        if [ ! -z $portn ]; then
                if  [ $port != $portn ]; then
                        rst $port badport
                fi
        fi
done
done
Внесу дополнения для полной картины. Код скрипта tf.sh. Здесь все обстоит следующим образом.
Серверные файлы установлены в ~/srv_files
Конфиги для каждого из шести серваков обзываются в виде ~/tf/srv_files/tf/cfg/server.cfg1

PHP:
#! /bin/bash

ARGS=2
if [ $# != 2 ]; then
        echo "Usage: $0 {1 - 6} {start|stop|restart}"; exit 3
fi

# Parameters

rlog=runlog.txt
port=27014
port=$(( $port + $1 ))
tvport=$(( $port + 20 ))
path="/home/tf2/srv_files/"
run='srcds_run -game tf -ip 0.0.0.0 +maxplayers 32'
map=`head -n 1 ${path}tf/cfg/mapcycle.txt$1`

# Functions

function startsrv # Функция запуска
{
if ps ax | egrep "[s]rcds_run.*$port" > /dev/null
then
        echo -ne "\t[fail]\n"
        echo -e "`date`\tFail start server$1" >> $rlog
else
        echo -e "`date`\tSuccess start server$1" >> $rlog
        mkdir -p /tmp/server$1; cd /tmp/server$1; echo "" > screenlog.0 # Переход во временный каталог для скрина
        screen -LAmdS server$1 ${path}${run} -port $port +clientport $(( $port + 100 )) +tv_port $tvport +map $map +mapcyclefile mapcycle.txt$1 +servercfgfile server.cfg$1 +sm_basepath addons/sourcemod$1 +mm_pluginsfile addons/metamod/metaplugins.ini$1 -nocrashdialog -steamport 200$1
        echo -ne "\t[ok]\n"
fi
}

function stopsrv # Функция останова
{
if kill -9 `ps ax | grep server$1 | grep -v grep | awk '{print $1}'` 2>/dev/null
then
        echo -ne "\t[ok]\n"
        echo -e "`date`\tSuccess stop server$1" >> $rlog
else
        echo -ne "\t[fail]\n"
        echo -e "`date`\tFail stop server$1" >> $rlog
fi
screen -wipe > /dev/null
}

# run command on server $srv

case $2 in

"start" )
        echo -ne "Starting server $1..."; startsrv $1

;;

"stop" )
        echo -ne "Stoping server $1... "; stopsrv $1
;;

"restart" )
        echo -ne "Stoping server $1... "; stopsrv $1; sleep 2
        echo -ne "Starting server $1..."; startsrv $1

;;

"*" )
        echo "Usage: $0 {1 - 6} {start|stop|restart}"; exit 3
;;

esac

Про метамод и сорсмод
C-подобный:
+mm_pluginsfile addons/metamod/metaplugins.ini$1
- здесь видно, что для каждого сервера есть свой файл metaplugins.ini1 metaplugins.ini2 и т.д.
Содержимое его для сервера 2 таково
C-подобный:
[tf2@tf2 ~]$ cat srv_files/tf/addons/metamod/metaplugins.ini2
;If your plugin came with a .vdf file, you do not need to use this file.
;
;List one plugin per line.  Each line should contain the path to the plugin's binary.
;Any line starting with a ';' character is a comment line, and is ignored.
;
;You do not need to include the _i486.so or .dll part of the file name.  Example:
; addons/sourcemod/bin/sourcemod_mm
;You may also put an alias in front of the file, for example:
; sm addons/sourcemod/bin/sourcemod_mm
;Will allow you to use "meta load sm" from the console.
;
;********* LIST PLUGINS BELOW ***********

addons/sourcemod2/bin/sourcemod_mm
Отсюда понятно, что для каждого сервера есть своя папка с сорсмодом
C-подобный:
[tf2@tf2 ~]$ ls -l /home/tf2/srv_files/tf/addons/
итого 40
drwxr-xr-x  3 tf2 tf2 4096 Ноя 17 17:49 metamod
-rwxr-xr-x  1 tf2 tf2   50 Май 13  2013 metamod.vdf
drwxr-xr-x  4 tf2 tf2 4096 Окт 16  2013 sourcemod
drwxr-xr-x 11 tf2 tf2 4096 Апр  9 18:40 sourcemod1
drwxr-xr-x 11 tf2 tf2 4096 Мар 29 12:02 sourcemod2
drwxr-xr-x 13 tf2 tf2 4096 Ноя 17 17:49 sourcemod3
drwxr-xr-x 11 tf2 tf2 4096 Апр 12 16:05 sourcemod4
drwxr-xr-x 11 tf2 tf2 4096 Май 14  2013 sourcemod5
drwxr-xr-x 11 tf2 tf2 4096 Май 14  2013 sourcemod6
В итоге получается используя файлы игры для одого сервера, запускать сколь угодно много серверов, указывая в запуске параметры, для конфиг файла, а так же см и мм.

З.Ы.: литературу для размещения несколькихх серверов на файлах одного взял где-то здесь.
 
Последнее редактирование:
Сверху Снизу