tiger_by
Гл. Админ SourceGames.RU
- Сообщения
- 631
- Реакции
- 278
Не знаю почему, но с некой периодичностью некоторые мои сервера крашатся с зависанием намертво или теряют порт. Пришлось наваять такой быдлокод скрипт для авторестарта серваков с уведомлением на email
Вот код.
Внесу дополнения для полной картины. Код скрипта tf.sh. Здесь все обстоит следующим образом.
Серверные файлы установлены в ~/srv_files
Конфиги для каждого из шести серваков обзываются в виде ~/tf/srv_files/tf/cfg/server.cfg1
Про метамод и сорсмод
- здесь видно, что для каждого сервера есть свой файл metaplugins.ini1 metaplugins.ini2 и т.д.
Содержимое его для сервера 2 таково
Отсюда понятно, что для каждого сервера есть своя папка с сорсмодом
В итоге получается используя файлы игры для одого сервера, запускать сколь угодно много серверов, указывая в запуске параметры, для конфиг файла, а так же см и мм.
З.Ы.: литературу для размещения несколькихх серверов на файлах одного взял где-то здесь.
Вот код.
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
Серверные файлы установлены в ~/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
Содержимое его для сервера 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
З.Ы.: литературу для размещения несколькихх серверов на файлах одного взял где-то здесь.
Последнее редактирование: