Скрипт автоматического перезапуска hlds(*NIX)

Обсуждаем все, что относится к выделенным серверам *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к
Нович0к
Сообщения: 1
Зарегистрирован: 16.02.2009

#11 Сообщение 17.02.2010, 10:49

пара нюансов в скрипте, проверка отсутствует на то чо если вдруг не запустился а pid от restartera остался, или наоборот - в этих случаях script не запустится

angel_samara
Нович0к
Нович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
Изображение

Ответить