Ключевые слова:win, service, (найти похожие документы)
From: Anton Borisov <a.borisov@tesv.tmb.ru>
Newsgroups: email
Date: Mon, 24 Feb 2004 14:31:37 +0000 (UTC)
Subject: [Windows] Создание простейшего сервиса на основе пакетного ".cmd" файла.
Краткая предыстория. Была поставлена команда в кратчайшие сроки создать
пакет, который удалял бы лишние одноименные приложения в системе.
Времени на развертывание Visual Studio или подобных продуктов нет. И уж
тем более не хватает времени на проектирование пакета. Поэтому требуется
собрать из подручных средств необходимый сервис.
Для этого нам потребуются следующие файлы из Resource Kit для Windows
2000: ps.exe, kill.exe, sleep.exe, instsrv.exe, srvany.exe. Вместо kill
и ps я использовал утилиты с сайта http://www.sysinternals.com под названиями
pslist, pskill.
Итак, файлы, которые использовались имеют следующие размеры.
1)pslist.exe (86016 байт)
2)pskill.exe (77824 байт)
3)instsrv.exe (63488 байт)
4)srvany.exe (15872 байт)
5)sleep.exe (26013 байт)
6)killbill.cmd (сам файл сервиса)
Файл сервиса я назвал так по названию одноименного фильма Квентина Тарантино :)
Далее идет распечатка самого сервиса:
@Echo Off
REM ========================================================
REM 'KillBill' test service
REM killing every process with PID != "First in chain"
REM Anton Borisov, a.borisov@tesv.tmb.ru
REM 18 Feb 2004
REM ========================================================
set LOG=C:\WinNT\Temp\killbill.log
set PID=C:\WinNT\Temp\killbill.lst
set TIME=60
set PRG=Far
set MyCMD=KillBill
Echo "==========[ %MyCMD% Service startup! ]==========" >> %LOG%
time /t >> %LOG%
date /T >> %LOG%
:1
pslist | findstr %PRG% > %PID%
for /f "skip=1 tokens=2" %%I in ( %PID% ) do pskill %%I >> %LOG%
Echo "==========<< %MyCMD% terminated processes and sleeps now >>==========" >> %LOG%
time /t >> %LOG%
date /T >> %LOG%
Sleep.exe %TIME%
goto 1
О параметрах. В файл LOG складывается информация об "убитых" процессах и
текущая информация о времени старта, функционировании сервиса. В файл
PID записывается номера процессов, которые в системе обозначаются под
именами PRG (в данном случае ловим процессы под именем Far). Каждые 60
секунд проверяется количество приложений под именем "Far" и если их
количество больше 2, то второй и последующий процессы будут убиты.
Строка
for /f "skip=1 tokens=2" %%I in ( %PID% ) do pskill %%I >> %LOG%
занимается обработкой номеров процессов.
Файлы статистики и файл с номерами процессов складываются во временный
каталог C:\WinNT\Temp. Месторасположение файлов со статистикой, списком
процессов, времени проверки и имени процесса, как видите, задаются в
"killbill.cmd".
Установка сервиса:
1)Копируем файлы в каталог, например, (или в другое место, главное,
чтобы переменная PATH содержала этот путь) и переходим туда же
2)Инициализируем сервис - C:\WinNT\instsrv.exe killbill.cmd
C:\WinNT\srvany.exe
3)Запускаем "regedt32.exe"
4)Переходим на ветку HKLM\System\CurrentControlSet\Services в раздел killbill.cmd
5)Добавляем параметр: EDIT->Add Key под названием "Parameters" (Class="")
6)Переходим на созданный параметр и в него добавляем значение: Edit->
Add Value под названием Application (Data Type = REG_SZ, String = C:\WinNT\KillBill.cmd)
7)Закрываем редактор реестра
8)Из командной строки пишем: net start killbill.cmd
Все, процесс запущен и работает. Дальнейший пуск/остановка управляются
через меню Control Panel - > Services.
Посмотреть какие процессы были убиты сервисом, а также время его запуска
можно посмотреть в C:\WinNT\Temp\KillBill.log
В итоге собрали процесс, как модно сейчас говорить, "без специального
знания программных языков" ;-)
Антон Борисов, a.borisov@tesv.tmb.ru
18 Февраля 2004