Итак, прошла неделя, а никто не ругается. Напрасно. В приведённых кусках кода есть ошибки. Я доработал кое-что и предлагаю Вам улучшенный вариант решения задачи. Чего нам не хватало? Во-первых, нормального управления программой-"следователем". Писать всё руками в терминале не очень-то удобно. Во-вторых, отсутствует проверка нескольких машин. В-третьих, постоянно приходится прерывать задание в расписании, чтобы не "заваливало" сообщениями. Ну и вообще, надо пофиксить ошибки в ранней версии
Начнём почти всё начала... У нас будет три батника - запуск "следователя", батник для проверки одной машины, батник для нескольких машин. Два последних скрипта выделены в отдельные файлы из-за особенностей команды FOR и для удобства отладки. Файлы будут называться соответственно: checker.bat, check_host.bat и check_hosts.bat
Код check_host.bat:
Код:
![Выделить весь код](images/misc/selectcode.png)
@rem скрипт для проверки одной машины
@set ADMINHOST=frog
@set STASKHOME=C:\Temp\DZ
@set SERVICETOCHECK=Reset 5
@if "%1"=="" goto bad_usage
@ping %1 -n 1 >nul
@if errorlevel 1 goto ping_fails
@goto check_task
:ping_fails
@if exist %STASKHOME%\%1.offlined goto exit_here
@echo At %DATE% (%TIME%) host %1 is not responding! > %STASKHOME%\%1.offlined
@net send %ADMINHOST% Host %1 is not responding! It will be excluded from checklist!
@goto exit_here
:check_task
@%STASKHOME%\tasklist2.exe /svc /FI "б«г¦Ўл eq %SERVICETOCHECK%" /FI "‘®бв®п*ЁҐ eq ђ Ў®в Ґв" /FI "Џ®«м§®ў ⥫м eq NT AUTHORITY\SYSTEM" > %STASKHOME%\temporary.tmp
@rem This f**ked tasklist don't change errorlevel!
@find "%SERVICETOCHECK%" %STASKHOME%\temporary.tmp > nul
@if errorlevel 1 goto pavlik
@del %STASKHOME%\temporary.tmp > nul
@goto exit_here
:pavlik
@del %STASKHOME%\temporary.tmp > nul
@if exist %STASKHOME%\%1.badguy goto exit_here
@echo Служба %SERVICETOCHECK% была отключена %DATE% (%TIME%) > %STASKHOME%\%1.badguy
@net send %ADMINHOST% %1 : ќв®в Ј ¤ ®бв *®ўЁ« б«г¦Ўг %SERVICETOCHECK%!
@goto exit_here
:bad_usage
@echo Usage: check_host.bat HOSTNAME
@goto exit_here
:exit_here
@set ADMINHOST=
@set STASKHOME=
@set SERVICETOCHECK=
Пояснения к коду:
1) Для удобства (и Вашего, и моего) определение некоторых "личных" данных поизводятся в начале скрипта в виде команд @set VAR=Что-то-там. Это позволяет быстро редактировать данные применительно к каждому конкретному случаю. В данном скрипте определяются:
ADMINHOST - имя машины администратора, куда пойдёт сообщение об ошибке.
STASKHOME - домашния директория для скриптов и их временных данных
SERVICETOCHECK - имя службы, которую мы "блюдём".
2) Если Вы заметили, машина предварительно поверяется на "наличие в сети". Если машина не пингуется, то проверка службы на ней бессмысленна. Введение файла-блокера с расширенением .offlined позволяет избежать бесконечных сообщений об отключении. А кто будет чистить эти файлы? - спросите Вы. Об этом много позже.
3) Ещё одна исправленная ошибка (я бы сказал, Major bug). Как показала проверка, tasklist не устанавливает errorlevel! Точнее, устанавливает только при неправильных параметрах своего собственного Запуска. Пришлось выкручиваться с помощью команды find.
4) Отключение службы теперь вызывает однократное появление сообщения на машине администратора. За это отвечает файл .badguy. Об его удалении также поговорим попозже.
5) Чистка установленных в скрипте переменных желательна, но необязательна, поскольку особо секретных данных тут нет.
6) Если Вам интересно, что скрывается за крякозяблями, сохраните файл в ноутпаде, откройте cmd и скажите more check_host.bat
7) Как видите, добавлено некоторое подобие параметров запуска. Это позволяет использовать данную команду отдельно от остальных батников. Только необходимо заботиться об .offlined и .badguy -файлах.
Ссылка на
www.forum.oszone.net при использовании данных в коммерческих целях обязательна.
Следующий пост будет про check_hosts.bat...
[s]Исправлено:
hasherfrog, 11:10 13-05-2004[/s]
Добавлено:
Второй файл гораздо меньше по размеру. Он занимается проверкой машин из списка путем последовательного вызова скрапта check_host.bat для каждой машины.
Код check_hosts.bat:
Код:
![Выделить весь код](images/misc/selectcode.png)
@cls
@set %HOSTLIST=frog main temp fedya vasya petya tetyatanya
@FOR %%H IN (%HOSTLIST%) DO @check_host.bat %%H
@set %HOSTLIST=
Имена машин, как можно догадатся, объявлены в
HOSTLIST. Данный файл будет основным заданием, которое мы собираемся выполнять по расписанию. Остается только привести текст батника, который умеет поставить его в расписание. Это будет следующий пост (для удобства чтения).
Добавлено:
Мля, всё-таки склеились. Ждите следующий пост после 14:00. Может тогда не склеются. Или напишите что-нибудь...