Скрипт для мониторинга и авторестарта сервера

Вопросы по развитию сервера / development status

Скрипт для мониторинга и авторестарта сервера

New postby NeOn 14 Jan 2011, 20:14

Поскольку стандартная команда tasklist не изменяет значение переменной ERRORLEVEL, пришлось воспользоваться утилитой pslist из пакета PSTools (скачать пакет, почитать описание, если интересно кому ).
Не обязательно распаковывать весь пакет, достаточно файл PsList.exe достать из архива и поместить в папку с сервером и скриптом (...\FINAL).

rem *****************************************************
rem ** This script every 5 mins checks server's state **
rem ** and restarts server if need. **
rem ** System application error windows will be killed!**
rem *****************************************************

echo off
cls
:srv0
ping 127.0.0.1 -n 300 > nul

:kill_all
pslist dwwin
goto dww%errorlevel%

:dww0
taskkill /f /im dwwin.exe
ping 127.0.0.1 -n 2 > nul
goto kill_all

:dww1
pslist newServer
goto srv%errorlevel%

:srv1
echo (%date% %time%) Starting DOA OL Server!
start newServer.exe
goto srv0


Особенности:
1. Частота проверки наличия процесса сервера в памяти уменьшена до раза в 5 минут.
2. Выяснилось, что dwwin.exe (Microsoft Application Error Reporting), создает в Temp два файла вида *.dmp (с дампом памяти) и *_appcompat.txt (с отчетом об ошибке, который он собирается отправить в Microsoft). После корректного завершения своей работы (нажатие на кнопку "Не отправлять" или после их отправки) эти файлы удаляются. Т.к. скрипт прибивает dwwin, эти файлы остаются, так что придется периодически их удалять (проще всего попасть в Temp, набрав %Temp% в командной строке).
3. Скрипт протестирован в Win XP x64 Pro, должен работать и в обычной 32-битной XP (однако есть данные, что в версии Home Edition могут частично отсутствовать файлы утилит командной строки, так что нужно убедиться, что требуемые команды будут выполняться). В Висте и Семерке скорей всего работать не будет (или будет неправильно) - там другой механизм обработки сбоев приложений.

P.S. Метка kill_all внешне попортилась из-за автозамены, там должно быть двоеточие в начале строки.
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман

Re: Скрипт для мониторинга и авторестарта сервера

New postby Def 06 Feb 2011, 14:51

Спасибо за скрипт, все работает =)
на вин7 можно заставить работать если заменить dwwin.exe на WerFault.exe
Discord - Def#5351
User avatar
Def
3 dan
 
Posts: 296
Joined: 22 Aug 2009, 10:29
Medals: 1
Gen Fu champion (1)
Ник на сервере: Def

Re: Скрипт для мониторинга и авторестарта сервера

New postby NeOn 06 Feb 2011, 21:25

Рад, что мой скрипт пригодился.
Кстати, можно немного усовершенствовать его, автоматизировав удаление временных файлов из Temp'a. Для этого для XP нужно добавить в конец скрипта перед последней строчкой (goto srv0) две команды:
del %Temp%\*.dmp
del %Temp%\*_appcompat.txt

В вин7 вот только не знаю, создает ли WerFault.exe в Temp'e какие-либо файлы и с какими названиями. Однако, порывшись в инете поисковиком, нашел, что "Сигнатуры проблем сохраняются в отчетах об ошибках, которые хранятся в каталоге \Users\Master\AppData\Local\Microsoft\Windows\WER\ReportArchive\, каждый отчет – в отдельной папке Report******** (например, Report0a003e48), в файле Report.wer." И еще что локальные дампы "по умолчанию сохраняются в папку %LOCALAPPDATA%\Crashdumps, но в реестре вы можете изменить данное значение, а также количество сохраняемых WerFault-дампов." Проверить возможности не имею.

Еще можно было вместо PsList таки использовать встроенную команду tasklist, а проблема того, что errorlevel не меняется, легко обходится, если использовать другую команду для поиска в списке, переданном ей командой tasklist, т.е. вместо
pslist dwwin
сделать
tasklist | findstr /i /b dwwin.exe
Соответственно, для вин7 это будет:
tasklist | findstr /i /b WerFault.exe
Впрочем, это уже не суть важно.
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман

Re: Скрипт для мониторинга и авторестарта сервера

New postby NeOn 09 Feb 2011, 21:10

Новая версия скрипта. Чтобы она работала, понадобится утилита nircmd (очень мощная штука, что, однако не сказалось на ее размере), точнее ее консольный вариант nircmdc.exe (лежит в архиве вместе с основной прогой). Скачать утилиту и почитать описание можно на сайте производителя: http://www.nirsoft.net/utils/nircmd.html. Обратите внимание, что есть 32-битная и 64-битная версии утилиты, используйте ту или иную в зависимости от вашей операционной системы. Файл nircmdc.exe и командный файл, содержащий текст скрипта, поместите в папку FINAL.
Отличия от предыдущей версии.
1. Больше не понадобится утилита PsList (зато понадобится другая :) )
2. Скрипт можно использовать для запуска сервера, т.к. команда ожидания перенесена в конец скрипта.
3. Процесс Application Error Reporting больше не прибивается, а корректно завершает свою работу после того как будет автоматически закрыто его окно с сообщением об ошибке приложения. В связи с этим можно не беспокоиться об удалении создаваемых им временных файлов.
4. Для работы скрипта необходима утилита NirSoft Nircmd, точнее ее консольный вариант nircmdc.exe.

rem *****************************************************************************
rem ** This script every 5 mins checks server's state **
rem ** and restarts server if need. **
rem ** System application error windows will be correctly closed. **
rem ** NirSoft nircmdc.exe utility is necessary for script's functioning.**
rem ******************************************************************************

echo off
cls

:close_err
tasklist | findstr /i /b dwwin.exe
goto dww%errorlevel%

:dww0
nircmdc.exe win close process dwwin.exe
nircmdc.exe wait 2000
goto close_err

:dww1
tasklist | findstr /i /b newServer.exe
goto srv%errorlevel%

:srv1
echo (%date% %time%) Starting DOA OL Server!
start newServer.exe

:srv0
nircmdc.exe wait 300000
goto close_err


Примечания:
1. По идее, должно работать не только в ХР, но и в Win7, если заменить dwwin.exe на WerFault.exe (2 замены). То, что отчеты и локальные дампы будут сами удаляться и в Win7, требует проверки.
2. Можно запускать сервер в свернутом виде, если выполнять команду start с параметром /min:
вместо
start newServer.exe
написать
start /min newServer.exe
3. Кнопка outgame в окошке сервера замечательно крэшит программу сервера, я применял этот способ для тестирования скрипта (уверен, что задумана она не для этого, но мне пригодилась ее новая функция :)).
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман

Re: Скрипт для мониторинга и авторестарта сервера

New postby Def 09 Feb 2011, 23:11

:cool5 щас попробую )
странно, аутгейм вроде нормально работает, это видать у тебя какието проблемы (

какойто странный формат времени если честно... это явно не секунда*1000...
Discord - Def#5351
User avatar
Def
3 dan
 
Posts: 296
Joined: 22 Aug 2009, 10:29
Medals: 1
Gen Fu champion (1)
Ник на сервере: Def

Re: Скрипт для мониторинга и авторестарта сервера

New postby NeOn 09 Feb 2011, 23:47

Def wrote:странно, аутгейм вроде нормально работает, это видать у тебя какието проблемы (

Хм, действительно, работает... Когда подключаюсь к серваку, работает. А если клиент не запускаю - нажатие на кнопку вызывает ошибку.
Def wrote:какойто странный формат времени если честно... это явно не секунда*1000...

Это миллисекунды (секунда/1000).
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман

Re: Скрипт для мониторинга и авторестарта сервера

New postby Def 09 Feb 2011, 23:56

ну да, в смысле это явно не секунда/1000 судя по работе скрипта, хотя может это мне уже спать пора просто )
Discord - Def#5351
User avatar
Def
3 dan
 
Posts: 296
Joined: 22 Aug 2009, 10:29
Medals: 1
Gen Fu champion (1)
Ник на сервере: Def

Re: Скрипт для мониторинга и авторестарта сервера

New postby NeOn 10 Feb 2011, 02:07

Понаблюдав немного за работой скрипта, пришел к выводу, что nircmdc время от времени затирает выводящиеся строки. Что ж, такова, видимо, его особенность :). Я видел как только что появившиеся строчки в консоли вдруг исчезали 0_0. Из-за этого может казаться, что он ждет дольше, чем нужно, т.к. на экран как-будто ничего не выводится (а на самом деле удаляется). Но, главное, с временем все в порядке, сервер рестартуется четко.
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман

Re: Скрипт для мониторинга и авторестарта сервера

New postby Def 10 Feb 2011, 11:13

щас вот проснулся и неожиданно понял, что в секунде все таки 100 милисекунд, а не 1000 )
Discord - Def#5351
User avatar
Def
3 dan
 
Posts: 296
Joined: 22 Aug 2009, 10:29
Medals: 1
Gen Fu champion (1)
Ник на сервере: Def

Re: Скрипт для мониторинга и авторестарта сервера

New postby NeOn 10 Feb 2011, 13:22

И все-таки их 1000 :)
http://www.broadcasting.ru/wiki/index.p ... 0%B4%D0%B0

ЗЫ. Можно добавить ведение логов для уверенности, тогда и нагляднее все будет, и, когда/если сервак будет падать, можно будет по логам найти время рестарта.
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман

Re: Скрипт для мониторинга и авторестарта сервера

New postby Def 10 Feb 2011, 13:39

наверно, и правда 1000 )
щас уже вроде все нормально работает =)
Discord - Def#5351
User avatar
Def
3 dan
 
Posts: 296
Joined: 22 Aug 2009, 10:29
Medals: 1
Gen Fu champion (1)
Ник на сервере: Def

Re: Скрипт для мониторинга и авторестарта сервера

New postby NeOn 11 Feb 2011, 14:41

Версия скрипта с ведением логов (отличается от предыдущей только этим). Создает в текущей папке логи с именем формата SRVMON_log_текущая дата.txt

 Нажми меня
rem *****************************************************************************
rem ** This script every 5 mins checks server's state **
rem ** and restarts server if need. **
rem ** System application error windows will be correctly closed. **
rem ** NirSoft nircmdc.exe utility is necessary for script's functioning.**
rem ******************************************************************************

echo off
cls

:close_err
tasklist | findstr /i /b dwwin.exe
goto dww%errorlevel%

:dww0
echo %time% dwwin found in memory >> SRVMON_log_%date%.txt
nircmdc.exe win close process dwwin.exe
nircmdc.exe wait 2000
goto close_err

:dww1
echo %time% dwwin not found or closed >> SRVMON_log_%date%.txt
tasklist | findstr /i /b newServer.exe
goto srv%errorlevel%

:srv1
echo %time% Server is down, restarting... >> SRVMON_log_%date%.txt
echo (%date% %time%) Starting DOA OL Server!
start newServer.exe
echo %time% Server started >> SRVMON_log_%date%.txt

:srv0
echo %time% Server is Ok, waiting 5 minutes... >> SRVMON_log_%date%.txt
nircmdc.exe wait 300000
goto close_err
User avatar
NeOn
5 kyu
 
Posts: 61
Joined: 29 Oct 2010, 18:59
Ник на сервере: n/a
Кем играю:: Тина, Байман


Return to Сервер / Server


Who is online

Users browsing this forum: No registered users and 1 guest

cron