Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

как правильно запускать сервер?

, подскажите новичку
Статус пользователя viktor6
сообщение 28.1.2010, 18:13
Сообщение #21


Стаж: 19 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

Вот нарыл в инете несколько разных скриптов запуска и управления сервера CS
а вот вообще интересная статейка

1) Распределение имен процессов (делается не всегда, только при явных разделениях выполняемых задач).
Для удобной работы и анализа hlds процесса необходимо их как то различать (если у Вас более 1-го сервера на одном железе).
У каждого сервера есть своя сошки hlds_run и hlds_i686 (если не другая архитектура сервера ).
- открываем приложение hlds_run редактором или через mc терминала putty F4
- ищем строки с содержанием hlds_i686 и меняем в трех местах на hlds_i686_сlassic (пример).
- находим DEBUG="0" и меняем на DEBUG=""
- закрываем hlds_run и переименовываем сошки на hlds_i686 >>> hlds_i686_сlassic ; hlds_run >>> hlds_run_classic
- при запуске hlds_run_classic в ТОПе должен виден запущенный процесс hlds_i686_сlassic.

2) Разброс серверов по ядрам.
-1й способ:
Привязка процесса с pid хххххх к первому CPU (#0):
taskset -c 1 -p xxxxx
привязка сразу к двум
taskset -c 1,2 -p xxxxx
где ххххх - пид процесса
где С - приоритет работы процесса.
Код
-с1  реальное время (real time)
-с2  наилучшая работа (best effort)
-с3  бездействие (idle)


-2й способ:
taskset -p 0x00000001 xxxxx
taskset -p 0x00000002 yyyyy
Вопрос - где взять номер pid, будет понятно в пункте 4.
Так же можно вписать процесc разброса по ядрам в сам скрипт запуска.

3) Установка скриптов
Создаем редактором файл с кодировкой Unix формата, расширение не указываем.
К примеру называем файл скрипта hlds_classic
Сам скрипт:
Цитата
#!/bin/bash
# for ALFA-STRIKE project
# Credit: [A]SECTOR {www.alfa-strike}
# email: sectorrusso@gmail.com
# /etc/init.d/hlds_classic
#
#
### BEGIN INIT INFO
# Provides: hlds_classic
# Description: Counter-Strike 1.6 NoSteam linux dedicated server starting service
### END INIT INFO
RETVAL=0

#Путь к серверу
path="/home/cs/classic"

start() {
if [ -d $path ]; then
cd $path
#Строка запуска каждого сервера
sudo -u cs ./hlds_run_classic -binary ./hlds_i686_classic -noipx -nojoy -insecure -game cstrike +maxplayers 24 +port 27015 +ip xx.xxx.xx.xx +sv_lan 0 +exec server.cfg +map de_dust -pingboost 2 -pidfile hlds_classic.pid&
#где xx.xxx.xx.xx ваш айпи адрес и меняем на свой порт.
touch ./hlds_classic
fi
}

stop() {
#if [ -f $path/hlds_classic.run ]; then
killall hlds_run_classic
killall hlds_i686_classic
#kill 'cat hlds_classic.pid'
cd $path
rm -R hlds_classic.pid
rm -R cron.log
#запись информации в лог файл cron.log можно отключить в самом crontab, соответственно эту строку в скрипте закоментируем.
#rm -R ./hlds_classic
#fi
}

#Статус >>> старт,рестарт,остановка сервера
status() {
cd $path;
[ -f $path/hlds_classic.pid ]
}
case "$1" in
start)
start
echo "CS Server_classic starting"
;;
stop)
stop
echo "CS Server_classic stoping"
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac


Все скрипт готов, кидаем его в папку etc/init.d
Cтоит обратить внимание перед строкой запуска сервера стоит sudo -u cs , где cs - наш условный пользователь.
Cамим скриптам необходимо сменить владельца и выставить атрибуты (дать ему права), но не от рута:
Код
chown cs:cs hlds_classic
chmod 774 hlds_classic

Запуск:
Код
sudo /etc/init.d/hlds_classic start

Остановка:
Код
sudo /etc/init.d/hlds_classic stop

Рестарт:
Код
sudo /etc/init.d/hlds_classic restart

!!! После запуска сервера В директории сервера появится файлик hlds_classic.pid , в котором и будет указан номер pid.

4) Автоподъем серверов
И так бывают случаи, когда железо аварийно выключается (пропало питание и т.д.). При загрузке ОС железо продолжает работать а игровые сервера не стартуют.
Тут стоит задача поставить наши скрипты в автозагрузку.
Для этого удобнее создать скрипт (если у вас серверов несколько):
Цитата
#!/bin/sh
#
#####################################################
##### start servers ALFA-STRIKE 66 by [A]SECTOR #####
#####################################################
/etc/init.d/hlds_classic start > /dev/null
/etc/init.d/hlds_arena start > /dev/null

echo "Use Commands: >>> Start all servers"
exit $RETVAL

Назовем скрипт Start_server (кодировка unix формат) и помещаем его так же в папку /etc/init.d/
Добавляем наш скрипт в автозагрузку и даем права для запуска от Root.
Код
# rc-update add Start_servers default


5) Очистка памяти (запланированный ребут) + логирование.
К примеру на альфа серверах работает hlguard, сошка к-го съедаем за 2-3 дня оперативную память, что приводит к различным глюкам и нестабильности работы сервера.
Для этого в ночное время мы делаем сброс лишней информации к-я накопилась (обнуляем память) путем технической остановки всех игровых серверов КС, на несколько минут.
Очистка:
Открываем редактор crontab командой: sudo crontab -e под своим пользователем или сразу под рутом.
Вносим вручную строки как указано в примере на скрине, в зависимости от кол-ва серверов.
На скрине видно что каждый день, в 5 утра сервер классик останавливается а в 05.05 стартует снова.

Далее ctrl+x, Y enter (сохраняем).
Становимся под рутом:команда sudo -s пишем пароль.
Выполняем команды:
Код
killall cron  
/usr/sbin/cron

Все крон настроен.
Логирование:
Для просмотра логов в кроне указана задача формировать логи, cron.log к-е лежат рядом с hlds_run.
В к-х можно увидеть когда была перегрузка сервера.
С скриптах сервера указана задача удалять старые логи rm -R cron.log, т.к. в лог он пишет все что выводится в консоль демона.
Убрать логирование можно путем правки в crontab заменой >>/home/cs/classic/cron.log 2>&1 на >>/tmp/hlds_classic 2>&1 или > /dev/null
Все готово!

По настройке крона:
Допустимые значения:
минута от 0 до 59
час от 0 до 23
день_месяца от 1 до 31
месяц от 1 до 12 (можно три буквы из названия месяца,
регистр не имеет значения от jan до dec)
день_недели от 0 до 6 (0 это воскресенье,
можно писать от sun до sat)

Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению. Для этих полей можно указывать диапазоны значений, разделенных дефисом, например:

* 5 4-10 0-3 * echo "HELLO" -печать HELLO в 5:00 на 4,5,6,7,8,9,10
дни января, февраля, марта и апреля.


1
Цитата
#!/bin/bash
case "$1" in
start)
cd /home/viktor/KS_servera/GunGame
screen -A -m -d -S cst \
./hlds_run_gungames -game cstrike \
+port 27017 +map de_dust2 \
+maxplayers 22 -insecure +ip 10.100.146.15 -pingboost 2 -nomaster
echo "Srart CS Server"
;;
stop)
screen -S cst -X quit
echo "Stop CS Server"
;;
restart)
$0 stop
sleep 5
$0 start
echo "Restarting Gameserver: Counter-Strike 1.6"
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;

esac


2
Цитата
#!/bin/sh
#####################################################
##### start/stop/restart script v2 by sentenced #####
#####################################################
#srv1_name ; Server name, example cs_pub, do not use long names with spaces!
#srv1_fname ; full server name like CS 1.6 PUB Server
#srv1_script ; if server is hl1 then type hlds_run if server is hl2 or CS:S type srcds_run
#srv1_ip ; IP address of server
#srv1_port ; Server port
#srv1_gametype ; Gametype, example cstrike, dods, or dod, etc.
#srv1_players ; maximum players on server
#srv1_map ; starting map
#srv1_svlan ; sv_lan 0/1, if your server is nosteam you need to turn it on, type 1
#srv1_pid ; server uses this file to write there process id
#srv1_heapsize ; this opt sets how much [max] RAM in kb server will use
#srv1_opts ; type there other server opts, like -nomaster -insecure
####################################################

srv1_name=gundames
srv1_fname="gundames"
srv1_dirpath="/home/viktor/KS_servera/GunGame"
srv1_script=hlds_run
srv1_ip=10.100.146.15
srv1_port=27017
srv1_gametype=cstrike
srv1_players=20
srv1_map=de_dust2
srv1_svlan=1
srv1_pid=cspub.pid
srv1_heapsize=256000
srv1_opts="-nomaster -insecure -pingboost 3"

#####################################################
# don't tuch anything below this line!
#####################################################

#srv1_chk=`screen -ls | grep $srv1_name`
#srv1_chk=DATASVIT
function srv1_started() {
if [ -z $srv1_chk ]; then
return 1
else
return 0
fi
}

function srv1_stop() {
/usr/bin/screen -d -r $srv1_name -X quit
return 0
}

function srv1_start() {
srv1_started
if [ $? -eq 0 ]; then
return 1
fi
cd $srv1_dirpath && screen -AmdS $srv1_name ./$srv1_script -game $srv1_gametype +maxplayers $srv1_players +map $srv1_map +port $srv1_port -heapsize $srv1_heapsize +sv_lan $srv1_svlan $srv1_opts -pidfile $srv1_pid
return 0
}

function srv1_echo() {
echo -n $2
$1
if [ $? -eq 0 ]; then
echo -e "\t\t[ OK ]"
else
echo -e "\t\t[FAIL]"
fi
return 0
}

case $1 in
start)
srv1_echo srv1_start "STARTING $srv1_fname: `basename $0` start"
;;
stop)
srv1_echo srv1_stop "STOPING $srv1_fname: `basename $0` stop"
;;
restart)
srv1_echo srv1_stop "STOPING $srv1_fname: `basename $0` stop"
srv1_echo srv1_start "STARTING $srv1_fname: `basename $0` start"
;;
*)
echo "Use Commands: `basename $0` start|stop|restart"
;;
esac


3
Цитата
#!/bin/bash
srv_path="/home/viktor/KS_servera/GunGame_test/"
srv_fname="gungame1"
srv_hostname="GunGame Server"
srv_chk=`screen -ls | grep -c $srv_fname`
function srv_stop()
{
if [ "$srv_chk" -eq 0 ]; then
return 1
fi
screen -S $srv_fname -X quit >/dev/null 2>&1
return 0
}

function srv_start()
{
if [ $srv_chk -eq 1 ]; then
return 1
fi
# export LD_LIBRARY_PATH="$srv_path:$LD_LIBRARY_PATH"
#screen -wipe
cd $srv_path && screen -AmdS $srv_fname ./hlds_run -pingboost 2 -binary ./hlds_i686 -console -game cstrike -insecure +maxplayers 32 +map de_dust2 +port 27018 -pidfile ./gungame.pid +sv_lan 0
return 0
}
function srv_status()
{
printf "Server $srv_fname"
if [ $srv_chk -eq 1 ]; then
echo -e "\t\t[alive]"
else
echo -e "\t\t[down]"
fi
}
function srv_print()
{
echo -n $2
$1
if [ $? -eq 0 ]; then
echo -e "\t\t [ OK ]"
else
echo -e "\t\t [FAIL]"
fi
return 0
}
case $1 in
start)
srv_print srv_start "Starting $srv_fname :"
;;
stop)
srv_print srv_stop "Stopping $srv_fname :"
;;
status)
srv_status
;;
restart)
$0 stop
sleep 60
$0 start
;;
*)
echo "Use command: `basename $0` [start|stop|restart|status]"
;;
esac


4
Цитата
#! /bin/bash
#
# Start the Counter-Strike dedicated server.
#
# AUTHORS :
#
# Julien Escario ( pandemik@azilog.net )
# &
# Cedric Rochat ( crochat@younics.org )
# &
# Cmdr._Firewalker ( cmdr._firewalker@web.de )
#
# ===========================================
#
# What you need:
#
# Linux :)
# awk
# screen
# the hlds_l & cstrike files (obtainable via steam)
#
# How to use:
#
# Edit the CS_USER-Var to the user running your cs-servers
# Edit the DIR-Var to fit your system (just contains the path to the dir that contains hlds_run)
# Edit the PARAMS-Var to fit your needs
# - standard is startup as internet server
# if you use multiple scripts on one system you should change the NAME-var (otherwise
# all will be stopped if you run the script with "stop", and status will be useless)
#
# When this is done, copy the file to /etc/rc.d/init.d (or whereever your system stores the
# scripts for starting the services) and set the execute permission.
# Now you can link the script to your runlevel-dir, here's an example for runlevel 3:
# ln -s /etc/rc.d/init.d/hlds /etc/rc.d/rc3.d/S90hlds
# ln -s /etc/rc.d/init.d/hlds /etc/rc.d/rc3.d/K50hlds
# or use update-rc.d if you got a system using that tool (like Debian, see manpage)
#
# Or use it manually like:
# ./hlds start
# ./hlds stop
#
# To see the server-console start the script with the parameter "watch".
#
# DOC by jwm (jwm@counter-strike.de)

# !!!!!!!!!!!!!! CHANGE THIS TO THE USER YOU USE FOR YOUR SERVER !!!!!!!!!!!!!!!
CS_USER=csserveruser

PATH=/bin:/usr/bin:/sbin:/usr/sbin

# # DON'T FORGET TO CHANGE THE PATH TO YOUR NEEDS!
DIR=/hlds

DAEMON=hlds_run

# LAN server:
# PARAMS="-game cstrike -nomaster -insecure +sv_lan 1 +maxplayers 16 +map de_dust"
# Internet server:
PARAMS="-game cstrike +map de_dust +maxplayers 12 -port 27015"

NAME=csserver
DESC="CS dedicated server"

# No edits (should be) necessary beyond this line

if [ ! -x `which awk` ]; then echo "You need awk for this script"; exit 1; fi
if [ ! -x `which screen` ]; then echo "You need screen (the program, moron!) for this script"; exit 1; fi

if [ `whoami` = root ]
then
usagetype=root
else
usagetype=nonroot
fi

start() {
if [ ! -d $DIR ]; then echo " ... No such directory: $DIR!"; exit 1; fi
if [ ! -x $DIR/$DAEMON ]; then echo "$DIR/$DAEMON does not exist or is not executable!"; exit 1; fi
if status; then echo " ... $DESC: $NAME is already running!"; exit 1; fi

case "$usagetype" in
root)
su - $CS_USER -c "cd $DIR ; screen -AmdS $NAME ./$DAEMON $PARAMS"
;;
nonroot)
cd $DIR ; screen -AmdS $NAME ./$DAEMON $PARAMS
;;
esac

}

stop () {
if ! status; then echo " ... $DESC $NAME could not be found. Probably not running."; exit 1; fi

case "$usagetype" in
root)
tmp=$(su - $CS_USER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
su - $CS_USER -c "screen -r $tmp -X quit"
;;
nonroot)
screen -r $(screen -ls | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}') -X quit
;;
esac
}

status () {
case "$usagetype" in
root)
su - $CS_USER -c "screen -ls" | grep [.]$NAME[[:space:]] > /dev/null
;;
nonroot)
screen -ls | grep [.]$NAME[[:space:]] > /dev/null
;;
esac
}

watch () {
if ! status; then echo "$DESC $NAME could not be found. Probably not running."; exit 1; fi

case "$usagetype" in
root)
tmp=$(su - $CS_USER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
su - $CS_USER -c "screen -r $tmp"
;;
nonroot)
screen -r $(screen -ls | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
;;
esac
}

case "$1" in
start)
echo "Starting $DESC: $NAME"
start
echo " ... done."
;;

stop)
echo "Stopping $DESC: $NAME"
stop
echo " ... done."
;;

restart)
echo "Restarting $DESC: $NAME"
stop
sleep 5
start
echo " ... done."
;;

status)
if status
then echo "$DESC: $NAME is UP"
else echo "$DESC: $NAME is DOWN"
fi
;;
watch)
watch
;;

*)
echo "Usage: $0 {start|stop|status|restart|watch}\nWhile watching press ctrl-a, ctrl-d to stop watching without stopping the server."
exit 1
;;

esac

exit 0


Отредактировал: viktor6, - 28.1.2010, 18:18
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
2 страниц V   1 2
 
Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: