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

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

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

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

Написать Скрипт запуска HLDS(C функцией kill PID)

, Скрипт для 2ух и более серверов под Linux
Статус пользователя kat5566
сообщение 12.7.2015, 11:16
Сообщение #1


Стаж: 11 лет

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

Нужен скрипт запуска сервера со следующим функционалом:

При запуске процесса hlds_linux определение его PID
В дальнейшем при зависании сервера (к примеру segmentation fault) процесс hlds_linux килялся бы командой kill -9 PID
+ функции для crontab (start stop checker console) ну вообщем всё что есть в любом обычном скрипте... главное убийство процессов по PID.

В линуксе не шарю так сказать... но элементарное знаю)

Использую сейчас вот этот
Скрипт
Код
#! /bin/bash

################################################################################
##
#                                                                                #
#  Counter-Strike : 1.6 Launcher                                         #
#                                                                                #
#  Author remake: neygomon                             #
#  Original Code: Cr@zy                                                          #
#  Contact: http://www.unserver.ru                                               #
#                                                                                #
#  This program is free software: you can redistribute it and/or modify it       #
#  under the terms of the GNU General Public License as published by the Free    #
#  Software Foundation, either version 3 of the License, or (at your option)     #
#  any later version.                                                            #
#                                                                                #
#  This program is distributed in the hope that it will be useful, but WITHOUT   #
#  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
#  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more         #
#  details.                                                                      #
#                                                                                #
#  You should have received a copy of the GNU General Public License along       #
#  with this program.  If not, see http://www.gnu.org/licenses/.                 #
#                                                                                #
#  Usage: /etc/init.d/hlds_launcher {start|stop|status|restart|console|update}   #
#    - start: start the server                                                   #
#    - stop: stop the server                                                     #
#    - status: display the status of the server (down or up)                     #
#    - restart: restart the server                                               #
#    - console: display the server console where you can enter commands.         #
#     To exit the console without stopping the server, press CTRL + A then D.    #
#    - update: update the server                                                 #
#                                                                                #
################################################################################
##

### BEGIN INIT INFO
# Provides:          hlds
# Required-Start:    $syslog $local_fs $network
# Required-Stop:     $syslog $local_fs $network
# Should-Start:      $remote_fs $named
# Should-Stop:       $remote_fs $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start hlds Server
# Description:       hlds Start Script
### END INIT INFO

# Game config
STEAM_LOGIN="anonymous"            #Не менять:) HL1 сервера выкачиваются и с анонимуса:)
SCREEN_NAME="mix"            #Название screen-сессии
USER="katastrofa"                #Пользователь, от которого будем запускать сервер. !!!От root запускать сервера не стоит!!!
DIR_STEAMCMD="/home/katastrofa/steamcmd"    #root Директория steamCMD
DIR_ROOT="/home/katastrofa/mix"        #root Директория HLDS
DIR_GAME="$DIR_ROOT/cstrike"        #Это не менять:)
DIR_LOG="/home/katastrofa/mix"
DAEMON_GAME="hlds_run"            #HLDS скрипт | Не менять:)
PID_VAR=0

#Start Распределение серверов по ядрам процессора
USE_CORE="1"                #Ядро, на котором запускать HLDS. 0 - первое ядро, 1 - второе ядро и тд. all - все ядра (дефолт значение)
                    #По умолчанию используются все ядра системы, но HLDS - однопроцессорное приложение.
                    #Поэтому данную настройку следует использовать в случае нескольких серверов, чтобы все сервера не легли на одно ядро.
#End Распределение серверов по ядрам процессора
                
MAXPLAYERS="22"                #Количество слотов - 32 максимум ( HL1 limit:c )
SYS_TICRATE="1100"            #sys_ticrate
IP="192.168.0.3"                #IP адрес сервера
PORT="27019"                #Порт сервера
EXTRAPARAMS="-pingboost 3"        #Дополнительные параметры запуска

PARAM_START="-game cstrike -port $PORT +ip $IP -maxplayers ${MAXPLAYERS} +sys_ticrate $SYS_TICRATE +map de_dust2 -noipx -insecure ${EXTRAPARAMS}"
PARAM_UPDATE="+login ${STEAM_LOGIN} +force_install_dir ${DIR_ROOT} +app_update 90 validate +quit"

function start {
  if [ ! -d $DIR_ROOT ]; then echo "ERROR: $DIR_ROOT is not a directory"; exit 1; fi
  if [ ! -x $DIR_ROOT/$DAEMON_GAME ]; then echo "ERROR: $DIR_ROOT/$DAEMON_GAME does not exist or is not executable"; exit 1; fi
  if status; then echo "$SCREEN_NAME is already running"; exit 1; fi

  # Start game
  echo "Start command : ${PARAM_START}"
  if [ $USE_CORE = "all" ]
  then
    echo "HLDS use full proc"
  else
    echo "HLDS use $USE_CORE"
   fi    
      
  if [ `whoami` = root ]
  then
    cd $DIR_ROOT
    if [ $USE_CORE = "all" ]
    then
      INIT="screen -AmdS $SCREEN_NAME"
    else
      INIT="taskset -c $USE_CORE screen -AmdS $SCREEN_NAME"
    fi
    $INIT sudo -u $USER ./$DAEMON_GAME $PARAM_START  
else
    cd $DIR_ROOT
        if [ $USE_CORE = "all" ]
    then
      screen -AmdS $SCREEN_NAME ./$DAEMON_GAME $PARAM_START
    else
      taskset -c $USE_CORE screen -AmdS $SCREEN_NAME ./$DAEMON_GAME $PARAM_START & PID_VAR=$!
    fi
  fi
}

function stop {
  if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

  screen -p 0 -S $SCREEN_NAME -X eval 'stuff "quit"\015'
}

function status {
  screen -ls | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
}

function console {
  if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

    screen -r $(ps -ef | grep SCREEN | grep "$SCREEN_NAME" | grep -v grep | awk '{ print $2}')
}

function update {
# Create the game root
   if [ ! -d $DIR_ROOT ]
  then
    echo "$DIR_ROOT does not exist, creating..."
    if [ `whoami` = root ]
    then
      su - $USER -c "mkdir -p $DIR_ROOT";
    else
      mkdir -p "$DIR_ROOT"
    fi
  fi    
# Update or install server
  if [ `whoami` = root ]
  then
    su - $USER -c "cd $DIR_STEAMCMD; ./steamcmd.sh $PARAM_UPDATE 2>&1"
  else
    cd $DIR_STEAMCMD
    ./steamcmd.sh $PARAM_UPDATE 2>&1
  fi
# Check install server  
  if [ ! -d $DIR_GAME ]; then update; else echo "$SCREEN_NAME update or install successfully"; exit 1; fi

  exit 1
}

function checker {
  checktag="[Checker HLDS]"
  checkresp=`quakestat -P -a2s $IP:$PORT | grep response`
  if [ -n "$checkresp" ]
  then
    echo "$checktag Server $SCREEN_NAME *[No Response]*"
    cd $DIR_LOG
    time=`date +%X`
    date=`date +%D`
    printf "[$time - $date] Server $SCREEN_NAME *[No response]*\n" >> checker.log  
    #stop
    kill -9 `screen -list | grep "SCREEN_NAME" | awk {'print $1'} | cut -d . -f1`
    screen -wipe > /dev/null
    #sleep 2
    kill -s 9 ${PID_VAR}
    sleep 2
    start
    exit 1
  fi
  
  checkdown=`quakestat -P -a2s $IP:$PORT | grep DOWN`
  if [ -n "$checkdown" ]
  then
    echo "$checktag Server $SCREEN_NAME *[DOWN]*"
    cd $DIR_LOG
    time=`date +%X`
    date=`date +%D`
    printf "[$time - $date] Server $SCREEN_NAME *[DOWN]*\n" >> checker.log
    #stop
    if status; then kill -9 `screen -list | grep "SCREEN_NAME" | awk {'print $1'} | cut -d . -f1`; screen -wipe > /dev/null; fi
    sleep 2
    start
    exit 1
  fi

  checkup=`quakestat -P -a2s $IP:$PORT | grep cstrike`
  if [ -n "$checkup" ]
  then
    echo "$checktag Server $SCREEN_NAME *[RUN]*"
    exit 1
  fi
}

function usage {
  echo "Usage: $0 {start|stop|status|restart|console|update|checker}"
  echo "On console, press CTRL+A then D to stop the screen without stopping the server."
}

case "$1" in

  start)
    echo "Starting $SCREEN_NAME..."
    start
    sleep 5
    echo "$SCREEN_NAME started successfully"
;;

  stop)
    echo "Stopping $SCREEN_NAME..."
    stop
    sleep 5
    echo "$SCREEN_NAME stopped successfully"
;;

  restart)
    echo "Restarting $SCREEN_NAME..."
    status && stop
    sleep 5
    start
    sleep 5
    echo "$SCREEN_NAME restarted successfully"
;;

  status)
    if status
    then echo "$SCREEN_NAME is UP"
    else echo "$SCREEN_NAME is DOWN"
    fi
;;

  console)
    echo "Open console on $SCREEN_NAME..."
    console
;;
  update)
    echo "Starting the $SCREEN_NAME update..."
    update
;;
  checker)
    echo "Check running $SCREEN_NAME..."
    checker
;;

  *)
    usage
    exit 1
;;

esac

exit 0
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Fire
сообщение 12.7.2015, 11:33
Сообщение #2


Иконка группы

Стаж: 17 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

-debug в строку запуска и сервер будет перезапускаться при сегфальте.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя kat5566
сообщение 12.7.2015, 11:54
Сообщение #3


Стаж: 11 лет

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

Цитата(Fire @ 12.7.2015, 16:29) *
-debug в строку запуска и сервер будет перезапускаться при сегфальте.

Спасибо, попробую. А не знаешь случаем почему некорректно работает screen на команду service hlds console. Бывает нормально открывает а бывает вот так: \


Тоесть когда чекаешь, говорит запущен, а когда пытаешся открыть консоль говорит что не запущен...

Отредактировал: kat5566, - 12.7.2015, 11:55
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя 715kg
сообщение 16.7.2015, 21:50
Сообщение #4


Стаж: 14 лет

Сообщений: 11
Благодарностей: 2
Полезность: 0

Что бы открыть скрин. Узнай его PID командой screen -ls
После чего открывай командой screen -x PID
или задавай скрину название

screen -L -dmS название sudo -u root ./hlds_run -game cstrike ..... И так далее.

После чего открывай так.

screen -x название

Выход из скрина A+D.

-----------------------------------------------
Для твоего скрипта. ID процесса можно определить так.

ps -ef | grep hlds_linux | grep -v grep | grep -v sh | grep тут IP | grep тут порт | awk '{ print $2}';

Думаю может поймешь как запихнуть это в переменную и подставь эту переменную в kill

Отредактировал: Bloo, - 16.7.2015, 21:54
Причина: Выдано устное предупреждение!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя EATEN
сообщение 17.7.2015, 7:50
Сообщение #5
Стаж: 18 лет

Сообщений: 131
Благодарностей: 61
Полезность: 252

Цитата(715kg @ 16.7.2015, 22:45) *
Выход из скрина A+D.


Если мне память не изменяет - выход из скрина так: Ctrl+A -> D
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fire
сообщение 17.7.2015, 8:05
Сообщение #6


Иконка группы

Стаж: 17 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

screen -list
screen -r name
ctrl + A,D


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя kat5566
сообщение 23.7.2015, 3:10
Сообщение #7


Стаж: 11 лет

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

Цитата(715kg @ 17.7.2015, 1:45) *
Что бы открыть скрин. Узнай его PID командой screen -ls
После чего открывай командой screen -x PID
или задавай скрину название

screen -L -dmS название sudo -u root ./hlds_run -game cstrike ..... И так далее.

После чего открывай так.

screen -x название

Выход из скрина A+D.

-----------------------------------------------
Для твоего скрипта. ID процесса можно определить так.

ps -ef | grep hlds_linux | grep -v grep | grep -v sh | grep тут IP | grep тут порт | awk '{ print $2}';

Думаю может поймешь как запихнуть это в переменную и подставь эту переменную в kill

А вы не можете мне помочь с запихиванием кода в этот скрипт) а то я в баше воолбще не силён... я только начал осваивать линукс... если требуется вознаграждению, то постараюсь выдать награду о_О
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя WarDeN4ik
сообщение 23.7.2015, 11:40
Сообщение #8


Стаж: 12 лет

Сообщений: 451
Благодарностей: 142
Полезность: 490

Кстати, опытным путем выяснил, что при жестком зависании сервера, т.е. когда он даже рестарнуть его автоматически не может, такое редко но бывает, например при проблемах соединения с БД, убивать процесс посредством kill -9 PID, не очень хорошо. Потому что, в таком случае сервер обычно перезапускается как то криво, а именно, потом screen не работает, то есть, невозможно зайти в консоль сервера hlds, а так же он не будет отвечать на команды скрипта которым он запускался, это значит его не остановить и не рестартнуть, а это уже полный ПЭ, считай теряется полностью контроль над сервером))
Поэтому более подходящий способ убить процесс в таком случае это kill -int PID, хотя иногда и он может привести к таким же последствиям.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: