Server-Autorestart Debian 64

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
Доброго времени суток!

Возник вопрос: Как сделать рестарт с определением падения, если серверное окно screen не закрыто? Оффтоп

Это отностися к теме по фиксу сервера Gmod.

Я не могу сделать обыкновенный рестарт, ведь при использовании одного глюка WireMod сервер выдаёт критическую ошибку и "выключается", хотя сам он ещё отвечает на запросы из PuTTY и не видим для игроков/коннектов.

Сревер запускается с теми модулями фикса и некоторыми аддонами, которые вместе работая, не вызывают крэша (ссылка выше).

Строка запуска:
screen -A -m -S gmod-serva ./scrds_run -console -game garrysmod -exec server.cfg +ip 0.0.0.0 +maxplayers 32

При этом скрин не уничтожается после падения, а, как я сказал, остаётся в нерабочем режиме.


Вопрос: как сделать авторестартер с автоматическим определителем статуса?

Заранее спасибо.


P.S.
Не подскажете, как можно разнообразить конвар mp_falldamage 1 для разной высоты?
А то при падении с высоты в 2,5 - 3 прыжка при гравитации в 800 ед. отнимается 50%, а при падении с высоты большей — 100% :blink:
 

Vit_ amin

Добрая душа
Сообщения
1,552
Реакции
741
Не подскажете, как можно разнообразить конвар mp_falldamage 1 для разной высоты?
А то при падении с высоты в 2,5 - 3 прыжка при гравитации в 800 ед. отнимается 50%, а при падении с высоты большей — 100%
Мб алисы сделать?
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
Vit_ amin, Как? Я имею ввиду высоту, не сам прыжок, если ты об этом..
 

Vit_ amin

Добрая душа
Сообщения
1,552
Реакции
741
alias fall1 "mp_falldamage 1;sv_gravity 700"
alias fall2 "mp_falldamage 1;sv_gravity 600"
alias fall "mp_falldamage 0;sv_gravity800"
Больше идей нету так как незнаком с garry mod
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
Vit_ amin, Эмм, нет это не выход, так вообще нельзя сделать конфигурацию.
Оффтоп
 

Vit_ amin

Добрая душа
Сообщения
1,552
Реакции
741
так вообще нельзя сделать конфигурацию
Всмысле нельзя ?Просто припиши это в valve.rc и пропиши в ркон консоли имя новой команды в алисе

Добавлено через 52 секунды
Лично я использую такие алисы и даже сделал динамическое меню с ними
alias buy1 "mp_buytime .25;say Время покупки людей = 15 секунд"
alias buy2 "mp_buytime .5;say Время покупки людей = 30 секунд"
alias buy3 "mp_buytime .75;say Время покупки людей = 45 секунд"
alias buy4 "mp_buytime 1;say Время покупки людей = 1 минута"
alias freeze1 "mp_freezetime 0;say Время заморозки игроков в начале раунда - Отключено"
alias freeze2 "mp_freezetime 3;say Время заморозки игроков в начале раунда = 3 секунды"
alias freeze3 "mp_freezetime 6;say Время заморозки игроков в начале раунда = 6 секунд"
alias freeze4 "mp_freezetime 10;say Время заморозки игроков в начале раунда = 10 секунд"
Добавлено через 3 минуты
А вот и динамическое меню
"Время заморозки(В начале раунда)"
{
"cmd" "#1;echo [SM] Админ установил новое время заморозки."
"execute" "server"
"1"
{
"title" "Какое время?"
"1" "freeze1"
"1." "0 секунд"
"2" "freeze2"
"2." "3 секунды"
"3" "freeze3"
"3." "6 секунд"
"4" "freeze4"
"4." "10 секунд"
}
}
 
Последнее редактирование:

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
А вот и динамическое меню
Увы, это тут не встроить, там моя новая админка, схожа с ULX и Evolve, но формат очень отличается.
А вот с алиасами попробую поработать, спасибо. :)

Добавлено через 1 минуту
Осталось только сделать авто-рестарт, можно будет мануал полный сделать.
 
Последнее редактирование:

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Я вот тоже задался этой проблемой, но с сервером CSS... Есть идея - отсеживаь последнюю строчку, и если она не меняется, то посылать скрину ctrl+c и стартовать заново.. Но как реально реализовать - это проблема - либо писать весь скрин в лог и по крону скажем каждые 5 минут сравнивать строки, либо еще как-то...
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
KorDen, Идея неплоха, но...
Хм.. А если не в скрине запускать, а, скажем, в демоне? По идее должен терминироваться?
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Я вот тоже задался этой проблемой, но с сервером CSS... Есть идея - отсеживаь последнюю строчку, и если она не меняется, то посылать скрину ctrl+c и стартовать заново.. Но как реально реализовать - это проблема - либо писать весь скрин в лог и по крону скажем каждые 5 минут сравнивать строки, либо еще как-то...
PHP:
#! /bin/bash
logfile=/.../.../xxx.log  # полный путь к файлу логов
time=3 # 3 секунды
while true; do
   string1=$(tail -n1 $logfile | sed "s/ //g"); sleep $time
   string2=$(tail -n1 $logfile | sed "s/ //g")
   if [ $string1 = $string2 ]; then
      kill -9 $(ps ax | grep screen_name | grep -v grep | awk '{print $1}'); screen -wipe
      screen -A -m -S screen_name ./scrds_run [params]                 
   fi
done
Внес окончательную поправку. Пользовайтесь
 
Последнее редактирование:

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Как это так...? Килать процесс по имени скрина?
Даже если поверить,
C-подобный:
[css32@css32 ~]$ screen -r
There are several suitable screens on:
        39095.css_dm    (Detached)
        33804.css_dm_35 (Detached)
        29945.css-dm-2  (Detached)
        40550.css-dm-3  (Detached)
        65109.css_cw    (Detached)
        79995.css_pub   (Detached)
        82582.css_pub2  (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
[css32@css32 ~]$ killall css_pub2
No matching processes belonging to you were found
[css32@css32 ~]$ screen -r
There are several suitable screens on:
        39095.css_dm    (Detached)
        33804.css_dm_35 (Detached)
        29945.css-dm-2  (Detached)
        40550.css-dm-3  (Detached)
        65109.css_cw    (Detached)
        79995.css_pub   (Detached)
        82582.css_pub2  (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
Как видно, он не кильнулся, а кильнуть srcds_run - не вариант, понятное дело. (стоит куча других в данный момент работающих серверов)
В моем случае (хотя наверняка и у других есть такие заморочки) посылать скрину команду quit тоже не вариант - он либо не отвечает, либо выкидывает "Segmentation fault", и в итоге сервер перезапускается на новом порту (так как часть старых процессов srcds_linux не завершилась и все еще "держит" порт). Эта же часть вырубается только при нажатии Ctrl-C - если писать -norestart и делать луп "while [ 1 -eq 1]...", то все равно те процессы не завершаются
Поэтому надо либо как-то посылать скрину "Ctrl+C", либо килать как-то по другому
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Впихнул
C-подобный:
screen -wipe
Правда это уж дело допиливающее, но общую картину улучшает.

Внесу некоторый коментарий, нужно понаблюдать максимальный рабочий простой сервера, чтобы не убить сервер, где игроки к примеру немного притаились или еще какой-нибудь "долговременный" игровой процесс бездействия происходит.
Думаю минимум 180 - 240 секунд надо выставлять. С другой стороны люди могут долго не заходить на сервер, от такого безделья сервер будет в итоге уходить в рестарт с завидной периодичностью. Лучше понять как ведет себя скрин во время подвисания. Возможно эффективнее будет проверять условие работает ли screen -r serv_name или нет и отталкиваться уже от этого.
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Впихнул
C-подобный:
screen -wipe
Правда это уж дело допиливающее, но общую картину улучшает.

Внесу некоторый коментарий, нужно понаблюдать максимальный рабочий простой сервера, чтобы не убить сервер, где игроки к примеру немного притаились или еще какой-нибудь "долговременный" игровой процесс бездействия происходит.
Думаю минимум 180 - 240 секунд надо выставлять. С другой стороны люди могут долго не заходить на сервер, от такого безделья сервер будет в итоге уходить в рестарт с завидной периодичностью. Лучше понять как ведет себя скрин во время подвисания. Возможно эффективнее будет проверять условие работает ли screen -r serv_name или нет и отталкиваться уже от этого.

Здесь обычно проблем нет - на многих серверах стоят различные рекламные плагины, которые пишут что-то каждые N секунд. Проверять скажем раз в N+10 секунд - и пустой сервер не будет рестартоваться. (и деятельность игроков так же не будет важна). И да, во время подвисания скрин отвечает, по идее подвисают процессы srcds_linux, а главный srcds_run все еще работает и отвечает на команды в своей консоли

И да, я поспешил с ответом... Скрин то килается, а вот сам сервер - нет. С удивлением зайдя в HLSW обнаружил что сервер запущен, и прописав ps убедился в этом - сервер работает как ни в чем ни бывало, вот только обратиться к нему теперь нельзя, так как скрин убит (хотя может и возможно как-то по другому, я не очень силен в линуксе). К умершему скрину, если не писать -wipe обратиться нельзя...

C-подобный:
[css32@css32 ~]$ screen -r
There are several suitable screens on:
        39095.css_dm    (Detached)
        80667.css_dm_35 (Detached)
        29945.css-dm-2  (Detached)
        40550.css-dm-3  (Detached)
        65109.css_cw    (Detached)
        79995.css_pub   (Detached)
        75378.css_pub2  (Dead ???)
Remove dead screens with 'screen -wipe'.
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

[css32@css32 ~]$ screen -r 75378
There is a screen on:
        75378.css_pub2  (Dead ???)
Remove dead screens with 'screen -wipe'.
There is no screen to be resumed matching 75378.

В общем головоломание продолжается =(


PS:
KorDen, Идея неплоха, но...
Хм.. А если не в скрине запускать, а, скажем, в демоне? По идее должен терминироваться?

По методу tiger_by проверяются обычные логи сервера и уже не важно, куда пишется консоль, вот только убивать придется по-другому
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Ребят, убивать можно по чему угодно. Я у себя рестарт делаю убивая процесс по порту
PHP:
kill -9 $(ps ax | grep 27015 | grep -v grep | awk '{print $1}')
Неважно по чем грепать, главное уникальность.
 

Rt.

Участник
Сообщения
396
Реакции
119
убивать нужно screen а не процессы в скринах.
screen -ls в имени скрина прямо указан ID, по которому убивать нужно. тогда никакого wipe и не нужно. (кроме краша сервера что аж подняться сам он никак не сможет).
вот вам кусок кода из моего проекта на php.

PHP:
<?php
function checkScreen($nameScreen, $pid = false) {

	//	screen -ls
	//	1310.server178  (08.11.2011 11:39:04)   (Detached)
	
	$answer = shell_exec('screen -ls');
	$lines = explode('\n', $answer);
	
	foreach ($lines as $string) {
	
		if (preg_match("/\b[0-9.]{1,}".$nameScreen."\b/", $string, $result)) {
		
			if (!preg_match("/\b(Detached)\b/", $string)) {
				shell_exec('screen -wipe');
				return checkScreen($nameScreen, $pid);
			}
			
			if ($pid !== false) {
				preg_match("/\b[0-9]{1,}/", $result[0], $pid);
				return $pid[0];
			} else return true;
		}
	}
	
	return false;
}

/*
$pid = checkScreen('css1', true);     // возвращает номер screen процесса.

if (!checkScreen('css1')) {
	// если сервер в скрине css1 НЕ запущен делаем тратата или что там вам нужно
}
?>
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
PHP:
#! /bin/bash
logfile=/.../.../xxx.log  # полный путь к файлу логов
time=3 # 3 секунды
while true; do
   string1=$(tail -n1 $logfile | sed "s/ //g"); sleep $time
   string2=$(tail -n1 $logfile | sed "s/ //g")
   if [ $string1 = $string2 ]; then
      kill -9 $(ps ax | grep screen_name | grep -v grep | awk '{print $1}'); screen -wipe
      screen -A -m -S screen_name ./scrds_run [params]                 
   fi
done
Внес окончательную поправку. Пользовайтесь

Маленький вопрос. Кто-нибудь использует данный скрипт? Есть ли какие пожелания. Собираюсь и у себя запускать из-за аномальных крашей.
 

The Night Fury

Участник
Сообщения
1,300
Реакции
1,395
tiger_by, Причина крашей уже давно известна.
vphysics.so.

Точнее его неверный код, при котором происходит магия и вертэксы считываются неверно.

Валв же сказали, что у них нет доступа к это файлу и его исходному коду. (LoLwO_Ot???!)


Уже есть один автор, который сделал более-менее работающий пак, но это ещё не защитило.
Есть предложение... Свой сделать на основе того.

Лично я пока код не использую, так и так что-то с рестартами творится.
 

tiger_by

Гл. Админ SourceGames.RU
Сообщения
631
Реакции
278
Не знаю в тему ли. Вчера гугли по поводу краша Team Fortress 2 серверов. Многим помогало полное удаление папки tf и затем установка через стим тулзу по новой. Но я считаю, что это не вариант и может не помочь. А про бинарник надо посмотреть.
 
Сверху Снизу