Server-Autorestart Debian 64

Тема в разделе "Общие вопросы", создана пользователем The Night Fury, 13 апр 2012.

  1. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.222
    Симпатии:
    915
    Доброго времени суток!

    Возник вопрос: Как сделать рестарт с определением падения, если серверное окно 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:
     
  2. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.059
    Симпатии:
    345
    Мб алисы сделать?
     
  3. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.222
    Симпатии:
    915
    Vit_ amin, Как? Я имею ввиду высоту, не сам прыжок, если ты об этом..
     
  4. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.059
    Симпатии:
    345
    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 нравится это.
  5. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.222
    Симпатии:
    915
    Vit_ amin, Эмм, нет это не выход, так вообще нельзя сделать конфигурацию.
    Оффтоп
     
  6. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.059
    Симпатии:
    345
    Всмысле нельзя ?Просто припиши это в valve.rc и пропиши в ркон консоли имя новой команды в алисе

    Добавлено через 52 секунды
    Лично я использую такие алисы и даже сделал динамическое меню с ними
    Добавлено через 3 минуты
    А вот и динамическое меню
     
    Последнее редактирование: 13 апр 2012
    The Night Fury нравится это.
  7. The Night Fury

    The Night Fury Администратор

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

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

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Я вот тоже задался этой проблемой, но с сервером CSS... Есть идея - отсеживаь последнюю строчку, и если она не меняется, то посылать скрину ctrl+c и стартовать заново.. Но как реально реализовать - это проблема - либо писать весь скрин в лог и по крону скажем каждые 5 минут сравнивать строки, либо еще как-то...
     
    The Night Fury нравится это.
  9. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.222
    Симпатии:
    915
    KorDen, Идея неплоха, но...
    Хм.. А если не в скрине запускать, а, скажем, в демоне? По идее должен терминироваться?
     
  10. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    PHP:
    #! /bin/bash
    logfile=/.../.../xxx.log  # полный путь к файлу логов
    time=# 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 
    -$(ps ax grep screen_name grep -v grep awk '{print $1}'); screen -wipe
          screen 
    ---S screen_name ./scrds_run [params]                 
       
    fi
    done
    Внес окончательную поправку. Пользовайтесь
     
    Последнее редактирование: 16 апр 2012
    ★Сириус★, KorDen, The Night Fury и 2 другим нравится это.
  11. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Как это так...? Килать процесс по имени скрина?
    Даже если поверить,
    Код:
    [[email protected] ~]$ 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.
    [[email protected] ~]$ killall css_pub2
    No matching processes belonging to you were found
    [[email protected] ~]$ 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", либо килать как-то по другому
     
  12. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    PHP:
    kill -$(ps ax grep screen_name grep -v grep awk '{print $1}')
    Так лучше?
     
    The Night Fury, KorDen и Серый™ нравится это.
  13. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Лучше, спасибо, только тогда после нее надо еще "screen -wipe" выполнять, потому что скрин помечается "умершим", но не убирается
     
  14. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Впихнул
    Код:
    screen -wipe
    Правда это уж дело допиливающее, но общую картину улучшает.

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

    KorDen Atra esterní ono thelduin! Ньюсмейкер

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

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

    Код:
    [[email protected] ~]$ 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.
    
    [[email protected] ~]$ 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:
    По методу tiger_by проверяются обычные логи сервера и уже не важно, куда пишется консоль, вот только убивать придется по-другому
     
  16. tiger_by

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Ребят, убивать можно по чему угодно. Я у себя рестарт делаю убивая процесс по порту
    PHP:
    kill -$(ps ax grep 27015 grep -v grep awk '{print $1}')
    Неважно по чем грепать, главное уникальность.
     
    KorDen нравится это.
  17. Rt.

    Rt.

    Сообщения:
    396
    Симпатии:
    121
    убивать нужно 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 НЕ запущен делаем тратата или что там вам нужно
    }
    ?>
     
    The Night Fury нравится это.
  18. tiger_by

    tiger_by Гл. Админ SourceGames.RU

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

    The Night Fury Администратор

    Сообщения:
    1.222
    Симпатии:
    915
    tiger_by, Причина крашей уже давно известна.
    vphysics.so.

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

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


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

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

    tiger_by Гл. Админ SourceGames.RU

    Сообщения:
    629
    Симпатии:
    279
    Не знаю в тему ли. Вчера гугли по поводу краша Team Fortress 2 серверов. Многим помогало полное удаление папки tf и затем установка через стим тулзу по новой. Но я считаю, что это не вариант и может не помочь. А про бинарник надо посмотреть.