Обсуждаем все, что относится к выделенным серверам *NIX (Unix, Linux) и Windows
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#1
Сообщение
26.10.2009, 15:51
Сам скрипт
Код: Выделить всё
#!/bin/sh
############################################################################
# #
# Script written by morfin for Bazalt43|CS 1.6|Public. #
# Version 0.7 #
# CONTACTS: #
# Mail: [email protected] #
# ICQ: 382904793 #
# This script restarting counter-strike server runned with -pidfile option #
# and -norestart option and restores pidfile if it was deleted when server #
# is running. It can be runned in background and when catched kill signal #
# 2 or 3 finishes hlds and exit normally. #
# P.S Don't try to kill server before it written pidfile. #
# #
############################################################################
#variable to set server pidfile name
PIDFILE="hlds.pid"
#restarter pidfile name default restarter.pid
RESTARTER_PIDFILE="restarter.pid"
#path to server
SERVER_PATH="ваш_путь"
#If script not included as library then execute that code
if [ "$INCLUDED" = "" ];then
VERSION="0.6"
if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then
echo $VERSION
exit
fi
if [ "$CALLED" = "" ]; then
#remember your current position
CURRENT_DIR=`pwd -L`
#scripts path
#SCRIPT_PATH=`dirname $0`
fi
cd $SERVER_PATH
#variable to set server check time
CHECK_TIME=60
#variable storing runscript
RUN_SCRIPT="screen -A -m -d -S noname_cs1.6_public ./hlds_run -game cstrike +map
de_dust2 -binary ./hlds_i686 +maxplayers 23 -noipx -tickrate 66 +sv_lan 0 -norestart
-pingboost 2 -pidfile ./${PIDFILE} -port 27020"
#File for logging errors and other default : restarter.log
LOG_FILE="restarter.log"
#script running first time
FIRST_RUN=1
#defining all very often calling commands
fi
start_server()
{
while (true)
do
if [ -e ${PIDFILE} ] ; then
if [ $(ps -p $(cat ${PIDFILE})|wc -l) = "1" ] ; then restart_server
fi
else restart_server
fi
sleep ${CHECK_TIME}
done
}
finish_server()
{
if [ "${TTY}" = "" ] ; then
TTY=`cat restarter.tmp`
rm restarter.tmp
fi
if [ -e ${PIDFILE} ]; then
PID=`cat ${PIDFILE}`
fi
echo "Wait for full stop of server">${TTY}
if [ $(ps -p $(cat ${PIDFILE})|wc -l) = "1" ] ; then
echo "Server was finished">${TTY}
rm ${PIDFILE}
rm ${RESTARTER_PIDFILE}
exit
else
kill -3 ${PID}
sleep 10
finish_server
fi
}
restart_server()
{
if [ "${FIRST_RUN}" = 1 ] ; then
FIRST_RUN=0
$(${RUN_SCRIPT}) >>/dev/null
echo "Please wait for full start of server">>${TTY}
sleep 30
if [ -e ${PIDFILE} ] ; then echo "Server was started successfully!">${TTY} ; fi
else
MESSAGE="Server was restarted after crash"
echo $(date "+%x %X") $MESSAGE >> ${LOG_FILE}
$(${RUN_SCRIPT}) >>/dev/null
fi
trap 'INCLUDED="1"; . $0 ; finish_server ' 2 3
}
start_restarter()
{
export CALLED="1"
export TTY=`tty`
export SERVER_PATH=${SERVER_PATH}
screen -A -m -d sh ${CURRENT_DIR}/`basename $0`>>mylog.txt
}
stop_restarter()
{
echo `tty`>restarter.tmp
kill -3 `cat ${RESTARTER_PIDFILE}`
echo "Successfuly stopped server"
}
start()
{
if [ -e ${RESTARTER_PIDFILE} ] ; then
if [ `ps -p $(cat ${RESTARTER_PIDFILE})|wc -l` = "1" ]; then start_restarter
else
echo "Server already running! (pid=`cat ${RESTARTER_PIDFILE}`)"
fi
else start_restarter
fi
}
restart()
{
if [ -e ${RESTARTER_PIDFILE} ] && [ `ps -p $(cat ${RESTARTER_PIDFILE})|wc -l` = "2" ]; then
stop_restarter
start_restarter
else echo "Can't restart: server not running!"
fi
}
stop()
{
if [ -e ${RESTARTER_PIDFILE} ] && [ `ps -p $(cat ${RESTARTER_PIDFILE})|wc -l` = "2" ] ; then
stop_restarter
else echo "Can't stop: server not running!"
fi
}
status()
{
if [ -e ${PIDFILE} ] && [ $(ps -p $(cat ${PIDFILE})|wc -l) = "2" ] ; then
echo "hlds running as pid $(cat ${PIDFILE})"
else echo "hlds not running"
fi
exit
}
if [ "${INCLUDED}" = "" ] ; then
if [ "${CALLED}" = "1" ] ; then
echo $$ > ${RESTARTER_PIDFILE}
start_server
else
if [ "$1" = "" ] ; then start
else
PARAMETER="`echo $1|tr [:upper:] [:lower:]`"
if [ ${PARAMETER} = "start" ] ; then start
elif [ ${PARAMETER} = "stop" ] ; then stop
elif [ ${PARAMETER} = "restart" ] ; then restart
elif [ ${PARAMETER} = "status" ] ; then status
fi
fi
fi
fi
#then return to previous location
if [ "$CALLED" = "" ]; then
cd ${CURRENT_DIR}
fi
ВНИМАНИЕ: Для указания имени pid файла рекомендуется использовать переменную ${PIDFILE}, а также сервер должен запускаться с параметром -norestart
Код: Выделить всё
Версия 0.1
-Скрипт корректно перезапускает сервер в случае падения и корректно завершает свою работу и работу сервера при SIGINT(CTRL C).
Версия 0.2
-Теперь скрипт поддерживает лог файлы а также параметры start stop и restart.
Версия 0.3
-Поправлены некоторые баги в коде
Версия 0.4
-Добавлена возможность выводить сообщения о успешном\неудачном запуске сервера, а также завершении сервера в терминал
Версия 0.5
-Добавлена опция status для проверки текущего статуса сервера.
Версия 0.6
-Теперь скрипт можно запускать из любого места
-Больше нет необходимости использовать внешний скрипт для запуска сервера - строка запуска указывается в самом скрипте
Данный скрипт умеет перезапускать сервер под *NIX, проверяя процесс каждые n секунд, где n берется из переменной CHECK_TIME. При выходе из скрипта происходит автоматическое закрывание сервера с помощью сигнала QUIT
Последний раз редактировалось
Morfin 12.05.2010, 18:29, всего редактировалось 29 раз.
-
xouk
- Капитан
- Сообщения: 323
- Зарегистрирован: 17.11.2007
- Благодарил (а): 1 раз
-
Контактная информация:
#2
Сообщение
26.10.2009, 23:57
del
Последний раз редактировалось
xouk 25.02.2011, 01:31, всего редактировалось 2 раза.
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#3
Сообщение
27.10.2009, 03:20
Если не жалко выложи сюда ;)
P.S Мой скрипт длинный из-за того что много проверок приходится делать
Последний раз редактировалось
Morfin 31.10.2009, 03:54, всего редактировалось 2 раза.
-
Dr_Quake
- Майор
- Сообщения: 654
- Зарегистрирован: 10.03.2008
- Поблагодарили: 6 раз
-
Контактная информация:
#4
Сообщение
27.10.2009, 12:57
Под никсы проще monit прикрутить
-
xouk
- Капитан
- Сообщения: 323
- Зарегистрирован: 17.11.2007
- Благодарил (а): 1 раз
-
Контактная информация:
#5
Сообщение
01.11.2009, 16:37
ладно так уж и быть пожалею вас, скину скрипт
скрипт
#!/bin/sh
# Source Dedicated Server Init Script
# Server options
TITLE='Source Dedicated Server' # Script initialization title
LONGNAME='left4dead' # Full title of game type
NAME='l4d' # Server handle for the screen session
DAEMON='srcds_run' # The server daemon
STEAM='/home/left4deadmania/l4d/l4d' # STEAM to Steam installation
USER='left4deadmania' # The User under which servers starts
# Game options
IP='*.*.*.*' # IP of the server
PORT='27015' # Port number to
MAP='l4d_vs_smalltown01_caves' # Initial map to start
GAME='left4dead' # Game type (tf|cstrike|valve|hl2mp)
SIZE='8' # Maximum number of players
# Server options string
OPTS="-game $GAME +map $MAP +ip $IP -port $PORT +maxplayers $SIZE -tickrate 66 -fps_max 1000 -pidfile $STEAM/$GAME/$NAME.pid"
# Screen command
INTERFACE="/usr/bin/screen -A -m -d -S $NAME"
service_start() {
# Check if the pid files currently exist
if [ ! -f $STEAM/$GAME/$NAME.pid ] && [ ! -f $STEAM/$GAME/$NAME-screen.pid ]; then
if [ -x $STEAM/$DAEMON ]; then
echo "Starting $TITLE - $LONGNAME"
echo "Server IP: $IP"
echo "Server port: $PORT"
echo "Server size: $SIZE players"
cd $STEAM
su left4deadmania -c " $INTERFACE $STEAM/$DAEMON $OPTS "
# Prevent race condition on SMP kernels
sleep 1
# Find and write current process id of the screen process
ps -ef | grep SCREEN | grep "$NAME" | grep -v grep | awk '{ print $2}' > $STEAM/$GAME/$NAME-screen.pid
echo "$TITLE screen process ID written to $STEAM/$GAME/$NAME-screen.pid"
echo "$TITLE server process ID written to $STEAM/$GAME/$NAME.pid"
echo "$TITLE started."
fi
else
echo -e "Cannot start $TITLE. Server is already running."
#exit 1
fi
}
service_stop() {
if [ -f $STEAM/$GAME/$NAME.pid ] && [ -f $STEAM/$GAME/$NAME-screen.pid ]; then
echo "Stopping $TITLE - $LONGNAME."
# Get the process ID from the pid file we created earlier
for id in `cat $STEAM/$GAME/$NAME-screen.pid`
do kill -9 $id
echo "Killing process ID $id"
echo "Removing $TITLE screen pid file"
rm -rf $STEAM/$GAME/$NAME-screen.pid
break
done
# Remove server pid file
echo "Removing $TITLE pid file"
rm -rf $STEAM/$GAME/$NAME.pid
# Wipe all old screen sessions
screen -wipe 1> /dev/null 2> /dev/null
echo "$TITLE stopped."
else
echo -e "Cannot stop $TITLE. Server is not running."
#exit 1
fi
}
case "$1" in
'start')
service_start
;;
'stop')
service_stop
;;
'restart')
service_stop
sleep 1
service_start
;;
*)
echo "Usage $0 start|stop|restart"
esac
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#6
Сообщение
02.11.2009, 02:33
Твой скрипт запускает\перезапускает\останавливает сервер, а мой крутится в скрине и в случае чего рестартит сервер, ну еще у него есть одна особенность 1 копия выполняет необходимые проверки и выходит, а 2 висит в бесконечном цикле в скрине и палит не упал ли сервер, короче он именно авторестартер, а не просто запуск\перезапуск\выход(необходимость возникла по причине бесконечного авторестарта после segmentation fault-а). Так что функционал разный.
И кстати код еще будет сокращаться по мере возможности.
Последний раз редактировалось
Morfin 02.11.2009, 02:41, всего редактировалось 2 раза.
-
xouk
- Капитан
- Сообщения: 323
- Зарегистрирован: 17.11.2007
- Благодарил (а): 1 раз
-
Контактная информация:
#7
Сообщение
02.11.2009, 02:41
хм, не знаю, у меня всё перегружается, хотя бывают моменты, когда сервер намертво зависает, но тогда его даже через процессы фиг убьёшь..
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#8
Сообщение
02.11.2009, 02:50
Ну виснуть ни разу не было чтоб намертво но было такое:
Код: Выделить всё
Segmentation fault(core dumped)
Auto-restarting the server on crash
Mon Nov 2 01:35:50 UTC 2009 Server restart in 10 seconds
Оно так рестартило много-много раз пока я не убивал нафиг сам и не рестартил(виноват был dproto еще когда версия нестабильная была). Если вдруг что-то подобное сработает то серв упадет и апнется сам, а то юзеры мне плешь проедят
-
pinkpiton2
- Майор
- Сообщения: 724
- Зарегистрирован: 06.08.2008
- Откуда: Одесса
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
#9
Сообщение
02.11.2009, 03:58
у меня на фряхе была очень частой картинка, когда серв лепил корку, подымался сам (запущеный родным srcds_run без каких-либо наворотов) но при подьёме считал, что его старый порт занят, и садился на следующий
как бы формально серв работает, но результат такой-же как от нерабочего
в связи с этим есть вопрос
можно ли без написания чего-то типа плагина к какому-нить сорсмоду проверять переменную hostport
выставлять флаг, и по его наличию скрипт уже сделает kill -9
PS: но что интересно на этой же машине CS 1.6 тоже иногда лепил корку, но подымался самостоятельно на своём же порту
чтение инструкции - 5$/строка
.
чтение инструкции с выражением - 25$/строка
.
чтение инструкции с пошаговым выполнением - прямо пропорционально тупости заказчика, но не менее 500$
.
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#10
Сообщение
06.12.2009, 07:42
У меня однажды после падения просто hlds порт не освободился(процесса нет, а порт открыт), но он увы не рестартнулся на следующем порте.
-
blackcat
- Нович0к
- Сообщения: 1
- Зарегистрирован: 16.02.2009
#11
Сообщение
17.02.2010, 10:49
пара нюансов в скрипте, проверка отсутствует на то чо если вдруг не запустился а pid от restartera остался, или наоборот - в этих случаях script не запустится
-
angel_samara
- Нович0к
- Сообщения: 12
- Зарегистрирован: 25.08.2009
#12
Сообщение
20.02.2010, 01:15
а скрип для запуска есть??? типо батника! чето не могу нормальный найти!
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#13
Сообщение
07.03.2010, 13:48
Обновил скрипт до версии 0.6, если найдете косяки\баги - пишите
-
Morfin
- Лейтенант
- Сообщения: 237
- Зарегистрирован: 19.10.2007
- Поблагодарили: 1 раз
#14
Сообщение
12.05.2010, 18:27
У меня есть маленька просьба к модерам\админам.. Прикрепите пожалуйста тему
-
leha---83
- Капитан
- Сообщения: 275
- Зарегистрирован: 24.11.2008
- Откуда: Perm (Chernushka)
-
Контактная информация:
#15
Сообщение
29.06.2010, 23:15
Всем привет!
есть у кого нибудь скрипт перезапуска для counter-strike source