Скрипт запуска Counter Strike Source

Обсуждаем все, что относится к выделенным серверам *NIX (Unix, Linux) и Windows
Сообщение
Автор
Аватара пользователя
bigbrain911
Майор
Майор
Сообщения: 618
Зарегистрирован: 22.03.2010
Откуда: http://zloy.pl.ua/
Поблагодарили: 11 раз
Контактная информация:

#16 Сообщение 07.09.2011, 22:05

Попробовал запустить скрипт без добавления в крон, сервер не стартует, вот что получается::

[>>] Проверка размера .log файлов
Файл checker.log отсутствует
Файл qconsole.log отсутствует
[>>] Запуск сервера test
Порт севрера: 27020
Привязка к ядру: 0
Запуск от юзера: hlds
Статус: root@game-server:/home/hlds#

запускал командой /etc/init.d/run_cssserver start от рута, в скрипте указан простой юзер, да и как по мне скрипт очень не удобный, писать длинные команды, если можно просто собрать ссылками в одном месте все простые скрипты запуска и стартовать через mc, но это мое мнение.

Есть ли простой скрипт перезапуска при краше? Мне чекеры не нужны (из 16 серверов за 3 дня завис только один), все сервера будут стартовать запуском одного скрипта, который позже добавлю в крон, нужно реализовать простейший перезапуск в случае краша, типо как было на винде:

@echo off
cls
:loop
start /wait e:\test\orangebox\srcds.exe -console -game cstrike -tickrate 66 +fps_max 0 +maxplayers 32 -port 27020 +map de_dust2 +tv_port 27060
echo (%time%) WARNING: srcds closed or crashed, restarting....
goto loop

для линухи сейчас так:
#!/bin/sh
echo "Starting CS:Source test"
sleep 1
screen -A -m -d -S test ./srcds_run -game cstrike -console +ip 0.0.0.0 -tickrate 66 +fps_max 0 +maxplayers 32 -port 27020 +tv_port 27060 +map de_dust2 +sv_lan 0

Подскажите как сделать?
i7-3770k, Asus P8Z77-V PRO, Team 2x4Gb 2000MHz, MSI 560GTX-Ti 2048MB, ssd 120gb+ 2 hdd 1Tb, HAF 912+
Панели управления игровыми серверами
http://zloy.pl.ua

Аватара пользователя
net-master
Капитан
Капитан
Сообщения: 446
Зарегистрирован: 07.11.2009
Поблагодарили: 1 раз

#17 Сообщение 08.09.2011, 21:34

Скрипт под Freebsd

Код: Выделить всё

#!/bin/sh

SERVER_NAME="Имя сервера"
screen_name=public
path="?server/dedicated/orangebox"
srcds_ip=127.0.0.1
srcds_port=27015
srcds_gametype=cstrike
srcds_players=30
srcds_map=de_dust2
srcds_pid=$screen_name.pid
srcds_restart=-norestart
screen_pid=$screen_name-screen.pid
srcds_options="+exec server.cfg"
use_user=имя пользователя
condebug=0
check_version=0
checker_command="qstat"
RETVAL=0

succes="[\033[1;32m OK \033[0m]"
failed="[\033[1;31m FAILED \033[0m]"
status_on="[\033[1;32m ONLINE \033[0m]"
status_off="[\033[1;31m OFFLINE \033[0m]"
title="\033[1;32m [Info]\033[0m"

if [ $condebug = 1 ]; then 
	srcds_options2="-condebug"
fi

# Процесс screen
INTR="screen -A -m -d -S $screen_name"

if [ ! -x $path/srcds_run ]; then
	printf "\033[22;31m Проверьте права на исполнение srcds_run \033[0m\n"
	exit 1
fi

prestart_check() {
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		ch='ps auxwww | grep $screen_name | grep scre'
		if [ -n "$ch" ]; then
			echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			printf "\033[1;34m Server $SERVER_NAME\033[0m \033[32m уже [ONLINE]\033[0m\n"
			echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			exit 1
		else 
			cd $path
			rm -rf $path/$screen_pid
			rm -rf $path/$srcds_pid
		fi
	fi
}


###################################################################################### Старт сервера ########################################################################################################
start() {
	if [ $check_version = 1 ]; then
		check_version
	fi
	# Проверка предстартовая
	#prestart_check

	printf "$title\033[1;34m Запуск Статистики сервера \033[0m\n"
	cd $path
	$INTR  ./srcds_run -game $srcds_gametype -master $srcds_restart +maxplayers $srcds_players  +map $srcds_map  +ip $srcds_ip +port $srcds_port   $srcds_options +log on  -pidfile  $path/$srcds_pid
	# Поиск и запись пидов процессов сервера и скринв системе
	ps auxwww | grep $screen_name | grep $srcds_port | grep scre | awk '{ print $2}' > $path/$screen_pid
	
	printf "$title\033[1;34m Запуск сервера $SERVER_NAME \033[0m\n"
	printf "\033[1;35m IP адрес:\033[0m \033[1;36m$srcds_ip\033[0m\n"
	printf "\033[1;35m Карта:\033[0m \033[1;36m$srcds_map\033[0m\n"
	printf "\033[1;35m UDP порт:\033[0m \033[1;36m$srcds_port\033[0m\n"
	printf "\033[1;35m Колличество игроков:\033[0m \033[1;36m$srcds_players\033[0m\n"
	printf "\033[1;35m Дополнительные опции:\033[0m \033[1;36m$srcds_options\033[0m\n"
	printf "\033[1;35m Тип игры:\033[0m \033[1;36m$srcds_gametype\033[0m\n"
	printf "\033[1;35m Запуск от пользователя:\033[0m \033[1;36m$use_user\033[0m\n"
	printf "\033[1;33m Статус => \033[0m"
	sleep 1
	
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		ch=`ps auxwww | grep $screen_name | grep scre`
		if [ -n "$ch" ]; then
			printf "%53s$succes \n"
		else
			printf "%53s$failed \n"
		fi
	fi
}

########################################################### Stop server #####################################################################################
stop() {
	if [ $check_version = 1 ]; then
		check_version
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		# Извлекаем ID процесса из файла и увибаем процессы
		# Завершаем КОРРЕКТНО сервер!!
		screen -R $screen_name -p 0 -X register . quit
		screen -R $screen_name -p 0 -X paste .
		screen -R $screen_name -p 0 -X stuff $'\n'
		screen -R $screen_name -X quit > /dev/null
		kill `cat $path/$srcds_pid`
                kill `cat $path/$screen_pid`
		sleep 1
		rm -rf $path/$screen_pid
		rm -rf $path/$srcds_pid
		printf "$title\033[1;31m Остановка $SERVER_NAME \033[0m"
		printf "%33s$succes \n"

	else
		printf "\033[1;34m Невозможно остановить $SERVER_NAME, сервер [OFFLINE] \033[0m"
		printf "%5s$failed \n"
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
} 
###################################################### Статус сервера ###############################################################################################
status() {
	if [ $check_version = 1 ]; then
		check_version
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	printf "$title\033[1;34m Статус сервера $SERVER_NAME \033[0m\n"
        printf "\033[1;35m IP Сервера:\033[0m \033[1;36m$srcds_ip\033[0m\n"
        printf "\033[1;35m Карта сервера:\033[0m \033[1;36m$srcds_map\033[0m\n"
        printf "\033[1;35m UDP порт:\033[0m \033[1;36m$srcds_port\033[0m\n"
        printf "\033[1;35m Колличество игроков:\033[0m \033[1;36m$srcds_players\033[0m\n"
        printf "\033[1;35m Дополнительные опции:\033[0m \033[1;36m$srcds_options\033[0m\n"
        printf "\033[1;35m Тип игры:\033[0m \033[1;36m$srcds_gametype\033[0m\n"
        printf "\033[1;35m Запуск от пользователя:\033[0m \033[1;36m$use_user\033[0m\n"
		printf "\033[1;33m Статус => \033[0m"
	sleep 1
	ch=`ps auxwww | grep $screen_name | grep scre`
	if [ -n "$ch" ]; then
		printf "%49s$status_on \n"
	else
		printf "%48s$status_off \n"
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

console() {
	if [ $check_version = 1 ]; then
		check_version
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		printf "$title\033[1;34m Подключение к консоли $SERVER_NAME сервера \033[0m\n"
		echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		printf "\033[36m Для выхода из консоли поочерёдно нажать \033[1;36mCtrl+A, D \033[0m\n" 
		printf "\033[36m Для листинга консоли поочерёдно нажать \033[1;36mCtrl+A, Esc \033[0m\n" 
		printf "\033[36m Для выхода из режима листинга нажать \033[1;36mEsc \033[0m\n" 
		printf "\033[1;31m Внимание!!! По неаккуратности можно положить сервер :D \033[0m\n"
		echo " Консоль включится через 5 секунд..."
		sleep 5
		screen -R $screen_name
	else
		printf "\033[1;31m Невозможно подключиться к $SERVER_NAME, сервер [OFLINE] \033[0m\n"
	fi
}

compile() {
	if [ $check_version = 1 ]; then
		check_version
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	if [ -d $path/cstrike/addons/sourcemod/scripting ]; then
		printf "\033[32m Компиляция плагинов sourcemod \033[0m\n"
		echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		printf "\033[36m Компилируются исходные файлы (smx), находящиеся в директории {addons/sourcemod/scripting/compiled/*.smx} \033[0m\n"
		printf "\033[36m По завершению компиляции нажмите Q для выхода \033[0m\n"
		printf "\033[36m Компиляция начнется через 2 секунды. \033[0m\n"
		sleep 2
		cd $path/cstrike/addons/sourcemod/scripting/
		sh compile.sh
		echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		printf "\033[32m Плагины скомпилированы \033[0m\n"
	else
		printf "\033[22;31m Проверьте установлен ли Sourcemod (??) \033[0m\n"
	fi
	echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

check_version() { 
   echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
   cd $path 
   rm -f version.txt 
   wget http://eqline.ru/project/srcds_init_script/version.txt 1> /dev/null 2>&1 
   sleep 1 
   for ver in `cat $path/version.txt` 
   do 
      if [ $VERSION \< $ver ]; then 
         printf "\033[1;31m Доступна новая версия скрипта ( $ver )\033[0m\n" 
         printf "\033[36m Подробнее на форуме eQline.ru: http://forum.eqline.ru \033[0m\n" 
         printf "\033[1;36m Ссылка: http://forum.eqline.ru/topic/361-скрипт-запуска-srcds-серверов/ \033[0m\n" 
      else 
         printf "\033[1;36m Ваша версия является последней\033[0m \033[1;34m( Текущая версия: $VERSION ) \033[0m\n" 
      fi 
   break 
   done 
   echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
   rm -f version.txt 
   sleep 1
}

check_logsize() {
	printf "$title\033[1;34m Проверка размера .log файлов \033[0m\n"
	maxlogsize=10485760
	if [ -f $path/checker.log ]; then
		sizeCheckUP=`stat -c%s $path/checker.log`
		printf "\t\033[1;36m Размер checker.log:\033[0m \033[1;35m $sizeCheckUP байт\033[0m\n"
		if [ "$sizeCheckUP" -ge "$maxlogsize" ]; then
			printf "\t\033[1;31m Очищаю файл checker.log\033[0m\n"
			tail -n 50 $path/checker.log > $path/checker.temp
			mv $path/checker.temp $path/checker.log  
			sleep 1
		fi
	else
		printf "\t\033[1;31m Файл checker.log отсутствует\033[0m\n"
	fi
	if [ -f $path/cstrike/qconsole.log ]; then
		sizeQconsole=`stat -c%s $path/cstrike/qconsole.log`
		printf "\t\033[1;36m Размер qconsole.log:\033[0m \033[1;35m $sizeQconsole байт\033[0m\n"
		if [ "$sizeQconsole" -ge "$maxlogsize" ]; then
			printf "\033[1;31m Очищаю файл qconsole.log\033[0m\n"
			tail -n 50 $path/cstrike/qconsole.log >  $path/cstrike/qconsole.temp
			mv  $path/cstrike/qconsole.temp  $path/cstrike/qconsole.log
			sleep 1
		fi
	else 
		printf "\t\033[1;31m Файл qconsole.log отсутствует\033[0m\n"
	fi
}

checker() {
	checktag="[HLDS-CheckUP]"
	checkresponse=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep response`
	if [ -n "$checkresponse" ]; then
		printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[31m*[No response]*\033[0m\n"
		# echo Отсылаем почту
		cd $path
		time=`date +%X`
		date=`date +%D`
		inlog=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep response`
		printf "[$time - $date] *[No response]* $inlog\n" >> checker.log
		stop
		sleep 2
		start
		sleep 1
		echo ----------------ATTANTION---------------- >> checker.log
		printf "StartUP $SERVER_NAME:" >> checker.log
		ch=`ps -ef | grep SCREEN | grep $screen_name`
		if [ -n "$ch" ]; then
			printf " *[OK]* \n" >> checker.log
		else
			printf " *[FAILED]* \n" >> checker.log
		fi
		echo ----------------------------------------- >> checker.log
		exit 1
	fi
	checkdown=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep DOWN`
	if [ -n "$checkdown" ]; then
		printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[31m*[DOWN]*\033[0m\n"
		# echo Отсылаем почту
		cd $path
		time=`date +%X`
		date=`date +%D`
		inlog=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep DOWN`
		printf "[$time - $date] *[DOWN]* $inlog\n" >> checker.log
		stop
		sleep 2
		start
		sleep 1
		echo ----------------ATTANTION---------------- >> checker.log
		printf "StartUP $SERVER_NAME:" >> checker.log
		ch=`ps -ef | grep SCREEN | grep $screen_name`
		if [ -n "$ch" ]; then
			printf " *[OK]* \n" >> checker.log
		else
			printf " *[FAILED]* \n" >> checker.log
		fi
		echo ----------------------------------------- >> checker.log
		exit 1
	fi
	checkup=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep cstrike`
	if [ -n "$checkup" ]; then
		printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[32m*[OK]*\033[0m\n"
		cd $path
		time=`date +%X`
		date=`date +%D`
		inlog=`quakestat -P -a2s $srcds_ip:$srcds_port | grep cstrike`
		printf "[$time - $date] *[OK]* $inlog\n" >> checker.log
		exit 1
	fi
}


prerestart() {
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		printf "$title\033[1;31m Начинается отчет до рестарта $SERVER_NAME \033[0m\n\t"
		cnt=$restarttime
		while [ $cnt -gt 0 ]; do
                	screen -R $screen_name -p 0 -X register . "say Server has been restart after $cnt seconds!"
                	screen -R $screen_name -p 0 -X paste .
                	screen -R $screen_name -p 0 -X stuff $'\n'
			echo -en "\r\t Рестарт через $cnt сек"
			let cnt=cnt-1
               		sleep 1
		done

                screen -R $screen_name -p 0 -X register . "say ============================================="
                screen -R $screen_name -p 0 -X paste .
                screen -R $screen_name -p 0 -X stuff $'\n'

                screen -R $screen_name -p 0 -X register . "say [ SERVER SHUTTING DOWN ]"
                screen -R $screen_name -p 0 -X paste .
               	screen -R $screen_name -p 0 -X stuff $'\n'

                screen -R $screen_name -p 0 -X register . "say ============================================="
                screen -R $screen_name -p 0 -X paste .
                screen -R $screen_name -p 0 -X stuff $'\n'

		printf "$succes\n"
        fi
       
}


case "$1" in
	start)
		check_logsize
		start
	;;
	stop)
		stop
	;;
	restart)
                prerestart
                sleep 2
                stop
                sleep 2
                start
	;;
	status)
		status
	;;
	console)
		console
	;;
	update)
		check_version
	;;
	checker)
		checker
	;;
	logsize)
		check_logsize
	;;
	*)
	echo "Usage: $0 {start|stop|restart|status|console|update|checker|logsize}"
	exit 1
esac
exit 0
Допливать нужно но в принципе работает.

Аватара пользователя
bigbrain911
Майор
Майор
Сообщения: 618
Зарегистрирован: 22.03.2010
Откуда: http://zloy.pl.ua/
Поблагодарили: 11 раз
Контактная информация:

#18 Сообщение 08.09.2011, 21:46

Я просил простой, без чеков, как на винде.
i7-3770k, Asus P8Z77-V PRO, Team 2x4Gb 2000MHz, MSI 560GTX-Ti 2048MB, ssd 120gb+ 2 hdd 1Tb, HAF 912+
Панели управления игровыми серверами
http://zloy.pl.ua

Аватара пользователя
net-master
Капитан
Капитан
Сообщения: 446
Зарегистрирован: 07.11.2009
Поблагодарили: 1 раз

#19 Сообщение 09.09.2011, 13:41

Код: Выделить всё

#!/bin/sh
echo "Starting CS:Source test"
sleep 1
screen -A -m -d -S test ./srcds_run -game cstrike -console +ip 0.0.0.0 -tickrate 66 +fps_max 0 +maxplayers 32 -port 27020 +tv_port 27060 +map de_dust2 +sv_lan 0
Куда уж проще ?)

Аватара пользователя
bigbrain911
Майор
Майор
Сообщения: 618
Зарегистрирован: 22.03.2010
Откуда: http://zloy.pl.ua/
Поблагодарили: 11 раз
Контактная информация:

#20 Сообщение 09.09.2011, 14:26

Я просил простой с перезапуском при краше, посмотрите пару постов выше.
i7-3770k, Asus P8Z77-V PRO, Team 2x4Gb 2000MHz, MSI 560GTX-Ti 2048MB, ssd 120gb+ 2 hdd 1Tb, HAF 912+
Панели управления игровыми серверами
http://zloy.pl.ua

Rassol2
Сержант
Сержант
Сообщения: 43
Зарегистрирован: 16.02.2011

#21 Сообщение 11.09.2011, 22:19

Уважаемый bigbrain911
а как вы хотите что ваш сервер при краше подымался без этого чудесного и сложного скрипта.

Нужно что бы чекер обрашялся к серверу и ему был ответ.
1-сервер работает (ничего не делать)
2-сервер отключен (запустить)
3-Процес спит/заморожен (особый случай, либо не трогать либо убить процесс и поднять заново. Это условие описано в скрипте запуска товарища LeXiKoN )

а без чеков тут никак.
Последний раз редактировалось Rassol2 11.09.2011, 22:22, всего редактировалось 2 раза.

Аватара пользователя
bigbrain911
Майор
Майор
Сообщения: 618
Зарегистрирован: 22.03.2010
Откуда: http://zloy.pl.ua/
Поблагодарили: 11 раз
Контактная информация:

#22 Сообщение 12.09.2011, 01:34

А как же он автоматически перезапускается, правда 1 раз. при стандартном запуске в скрине? Я думаю должен быть выход проще, сервер упал, процесс завершился - перезапуск и все это должно происходить в пределах скрина., может я много хочу или ошибаюсь.
i7-3770k, Asus P8Z77-V PRO, Team 2x4Gb 2000MHz, MSI 560GTX-Ti 2048MB, ssd 120gb+ 2 hdd 1Tb, HAF 912+
Панели управления игровыми серверами
http://zloy.pl.ua

Ответить