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

Тема в разделе "Linux", создана пользователем tiger_by, 19 апр 2014.

  1. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Не знаю почему, но с некой периодичностью некоторые мои сервера крашатся с зависанием намертво или теряют порт. Пришлось наваять такой быдлокод скрипт для авторестарта серваков с уведомлением на email

    Вот код.

    PHP:
    #!/bin/bash

    rst ()
    {
    num=$(( $27014 ))
    /
    home/tf2/tf.sh $num restart ## Запускает скрипт сотпа/старта сервера
    case $2 in
            idle
    )
            echo -
    "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 -
    "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 == ]; 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 -: -f 2)
                    
    k=$(( $k ))
                    
    sleep 10
                    
    if [ $k == ]; 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 + $))
    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 -"`date`\tFail start server$1" >> $rlog
    else
            echo -
    "`date`\tSuccess start server$1" >> $rlog
            mkdir 
    -/tmp/server$1cd /tmp/server$1; echo "" screenlog.0 # Переход во временный каталог для скрина
            
    screen -LAmdS server$${path}${run} -port $port +clientport $(( $port 100 )) +tv_port $tvport +map $map +mapcyclefile mapcycle.txt$+servercfgfile server.cfg$+sm_basepath addons/sourcemod$+mm_pluginsfile addons/metamod/metaplugins.ini$-nocrashdialog -steamport 200$1
            
    echo -ne "\t[ok]\n"
    fi
    }

    function 
    stopsrv # Функция останова
    {
    if 
    kill -`ps ax | grep server$1 | grep -v grep | awk '{print $1}'2>/dev/null
    then
            
    echo -ne "\t[ok]\n"
            
    echo -"`date`\tSuccess stop server$1" >> $rlog
    else
            echo -
    ne "\t[fail]\n"
            
    echo -"`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 $1sleep 2
            
    echo -ne "Starting server $1..."startsrv $1

    ;;

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

    esac

    Про метамод и сорсмод
    Код:
    +mm_pluginsfile addons/metamod/metaplugins.ini$1
    - здесь видно, что для каждого сервера есть свой файл metaplugins.ini1 metaplugins.ini2 и т.д.
    Содержимое его для сервера 2 таково
    Код:
    [[email protected] ~]$ 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
    
    Отсюда понятно, что для каждого сервера есть своя папка с сорсмодом
    Код:
    [[email protected] ~]$ 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
    
    В итоге получается используя файлы игры для одого сервера, запускать сколь угодно много серверов, указывая в запуске параметры, для конфиг файла, а так же см и мм.

    З.Ы.: литературу для размещения несколькихх серверов на файлах одного взял где-то здесь.
     
    Последнее редактирование: 19 апр 2014
    Hejter, san911, BatyaMedic и 4 другим нравится это.