[СКРИПТ] Проверка сервера на отклик. PYTHON

Тема в разделе "Linux", создана пользователем TolikCorp, 5 авг 2013.

  1. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    В общем: нашел вариант данной штуки, но там слегка было неудобно сделано. А именно: подгрузка данных из файла.
    Поисправлял, получилось вот:

    Для запуска необходим сам Python: apt-get install python

    PHP:
    #!/usr/bin/env python
    import socket,ConfigParser,sys,thread,time,datetime,os

    if len(sys.argv) == 1:
     
    sys.exit("Usage: python "+sys.argv[0]+" 'IP' PORT 'EXEC_CMD'")

    def server_moninoring(ip,port,exec_cmd):
     print 
    "[--------- Monitoring server "+ip+":"+port+" started\n"
     
    retry 0
     
    while 1:
      
    sock socket.socket(socket.AF_INETsocket.SOCK_DGRAM)
      
    sock.connect((ipint(port)))
      
    sock.send('\377\377\377\377TSource Engine Query\0')
      print 
    "[--------- Send [OK] to "+ip+":"+port+" waiting response for 120 sec...."
      
    sock.settimeout(120)
      try:
       
    text=sock.recv(1024)
      
    except Exceptione:
       print 
    "[--------- Error:%s"%" on server ip "+ip+":"+port
       retry 
    retry 1
       
    print "RETRY: " str(retry)
       if 
    retry 4:
         print 
    "[--------- Retry is more than 5, send restart shell cmd to system!"
         
    print exec_cmd
         os
    .system(exec_cmd)
         
    retry 0
       time
    .sleep(60)
       
    pass
      
    else:
       if (
    text.find('tf') > 1) or (text.find('cstrike') > 1) or (text.find('csgo') > 1) or (text.find('hl2mp') > 1):
        print 
    "[--------- Response [OK] from "+ip+":"+port+" next retry to request is 120 sec."
        
    retry 0
       time
    .sleep(120)

    print 
    "[--------- Loading server..."
    ip sys.argv[1]
    port sys.argv[2]
    exec_cmd sys.argv[3]
    print 
    "[--------- Server "+ip+":"+port+" successfully loaded"
    print "\n"
    thread.start_new_thread(server_moninoring, (ip,port,exec_cmd))
    while 
    1:
     
    time.sleep(60)
    Пример запуска:
    screen -AmdS check_css_27015 python ./srcds_status_checker.py "xxx.xxx.xxx.xxx" "27015" "КОМАНДА ДЛЯ РЕСТАРТА СЕРВЕРА"

    КОМАНДА ДЛЯ РЕСТАРТА СЕРВЕРА - скрипт, который перезапустит сервер.

    На данный момент поддерживает: TF2; CSS; CSGO; HL2MP
     

    Вложения:

    Chaos_Engine, san911, wanted241 и 7 другим нравится это.
  2. ★Сириус★

    ★Сириус★

    Сообщения:
    748
    Симпатии:
    200
    кто-нибудь пользуется этим?
    просто имеется один не стабильный сервер, вот задался вопросом, поствить что-нибудь что авоматом перезапускало зависший сервер
     
  3. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    У меня стоит. Да, реально работает.
     
  4. ★Сириус★

    ★Сириус★

    Сообщения:
    748
    Симпатии:
    200
    TolikCorp, а если сервер будет выключен?

    Добавлено через 7 минут
    а какая команда?
     
    Последнее редактирование: 29 ноя 2013
  5. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    это у каждого индивидуально. т.е. это та команда, которую ты бы написал в терминал и серв бы перезапустился.
     
  6. ★Сириус★

    ★Сириус★

    Сообщения:
    748
    Симпатии:
    200
    в смысле индивидуально?
    пример покажи команды
     
  7. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    screen -AmdS check_css_27015 python ./srcds_status_checker.py "xxx.xxx.xxx.xxx" "27015" "kill -9 ps ax | grep srcds_linux | grep -v grep | grep xxx.xxx.xxx.xxx | grep 27015 | awk '{print $1}'"
     
    ★Сириус★ нравится это.
  8. bigbrain911

    bigbrain911

    Сообщения:
    314
    Симпатии:
    23
    Как правило если сервер зависает то он нагружает ядро процессора на 100%, найти бы скрипт который глобально следил за нагрузкой процессов и убивал тот, который нагружает 100% ядро допустим более 3 минут (время нужно подобрать, чтобы не убивал при запуске всех серверов после ребута).
     
  9. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    И что, что на 100% загрузит? Он ведь по факту завис. Там 3 минуты реакция, тут 3 минуты реакция - какая разница?
     
  10. bigbrain911

    bigbrain911

    Сообщения:
    314
    Симпатии:
    23
    Разница в универсальности, зачем переделывать для каждого сервера запуск и иметь кучу проверок, если можно держать запущенным всего 1 скрипт.
     
  11. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Дай пример твоего скрипта, а то на словах то всё проще.

    Добавлено через 18 минут
    И зачем отдельно их запускать? вшиваем запуск монитора при старте серва и отключение его при выключении серва.
     
    Последнее редактирование: 1 дек 2013
  12. bigbrain911

    bigbrain911

    Сообщения:
    314
    Симпатии:
    23
    1. Скрипта у меня нет, но ищу.
    2. У меня 24 игровых сервера, менять скрипты запуска это куча работы + доп. нагрузка в виде мониторинга.
     
  13. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    У меня есть так сказать единый запусктр серверов, ему только путь к конфигу указать и всё. Сам запускает серв, сам запустит монитор, сам выполнит все необходимые проверки. 24 - не так уж и много.
    "менять скрипты запуска " у меня это решается добавлением двух строк в ЗАПУСКАТР
     
  14. artyrka94

    artyrka94

    Сообщения:
    182
    Симпатии:
    36
    а как запустить sh скрипт который лежит в той же директории, что и скрипт мониторинга?
    пробовал по разному
    ./start.sh
    sh: 1: start.sh: not found


    sh start.sh
    sh: 1: start.sh: not found

    (права 777 на все файлы стоят)
     
  15. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    нужно писать абсолютный пусть, тобишь /home/ и т.д.
     
  16. artyrka94

    artyrka94

    Сообщения:
    182
    Симпатии:
    36
    а в чем может быть проблема, если без screen запускаю то работает а если использую screen то он вылетает в то время когда должен запустить скрипт запуска [screen is terminating]
     
  17. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    выложи полностью команду
     
  18. artyrka94

    artyrka94

    Сообщения:
    182
    Симпатии:
    36
    PHP:
    screen ----S check_css_cw1 ./cheker_css.py "xxx.xxx.xxx.xxx" "27015" "cd /home/shift/css/CW1/ && sh start.sh"
     
  19. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    проверь так и заодно скинь содержимое sh /home/shift/css/CW1/sh start.sh
     
  20. artyrka94

    artyrka94

    Сообщения:
    182
    Симпатии:
    36
    start.sh:
    PHP:
    echo "CW1 start"
    kill `ps -ef | awk '! /awk/ && /css_cw1/ {print $2}'`
    sleep 1
    screen 
    ----S css_cw1 ./srcds_run -game cstrike -insecure -nocrashdialog -sv_tags no-steam -port 27015 +mp_flashlight 1 -tickrate 66 +fps_max 100 -maxplayers 20 +ip xxx.xxx.xxx.xxx +sv_lan 0 +map de_dust2 +log on +exec server.cfg