4

У меня есть пакетный файл, который часто перезапускает группу сервисов, разработанных собственными силами. Вскоре мы переходим от этого к чему-то более стабильному, но в настоящее время службы должны перезапускаться довольно часто, чтобы работать должным образом.

Чтобы упростить это, у меня есть пакетный файл, который выполняется по расписанию. Это выглядит так:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
ECHO ---------------------------------------------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO -----------=========%date%=========----------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO ---------------------------------------------->> log.txt

set DD=0
Set TIMESTAMP="eol=; tokens=1,2,3,4* delims=/, "
For /F %TIMESTAMP% %%i in ('DATE /t') DO (
  SET YYYYMMDD=%%l%%j%%k
  SET YYYYMM=%%l%%j
  set DD=%%k
)

echo A >> ServiceNames
echo B >> ServiceNames
echo C >> ServiceNames
echo D >> ServiceNames
echo E >> ServiceNames
echo F >> ServiceNames

for /f %%a in (ServiceNames) do (
    set timestamp=!date!!time!
    ECHO !timestamp! - Stopping Service %%a >> log.txt
    net stop /y srvService_%%a >> log.txt
    taskkill /f /im Service_%%a.exe >> log.txt

    ping localhost -n 15 > nul

    set timestamp=!date!!time!
    ECHO !timestamp! - Starting Service %%a >> log.txt
    net start srvService_%%a >> log.txt
)
if exist ServiceNames del ServiceNames

Проблема заключается в том, что в некоторых случаях командный файл не будет ждать, пока один сервис полностью завершит запуск, прежде чем остановить следующий сервис.

Как вы думаете, может помочь добавление дополнительной команды ping localhost после команды net start?

3 ответа3

3

Вы можете использовать код, подобный следующему, чтобы дождаться запуска службы (в этом случае я тестировал с w32time):

:WAIT
timeout /t 5 > NUL
for /f "tokens=4" %%s in ('sc query w32time ^| find "STATE"') do if NOT "%%s"=="RUNNING" goto WAIT
echo Service is now running!
2

Если при остановке не выполняется очистка, и они работают в своем собственном процессе, просто убейте процесс.

Ping - это не правильный способ немного поспать. Он загружает сеть. У вас есть 3 варианта. У всех есть различные варианты, чтобы показать / скрыть вещи.

timeout /t 5

или же

choice /d y /t 5

или же

waitfor /t 5 FredToMarryGinger
0

net start будет ждать завершения службы до ее возврата, поэтому, если пакетный файл включается до того, как служба завершает запуск, проблема заключается в том, что служба ложно сообщает, что она запущена, когда не запускается, или слишком долго истекает время ожидания команды.

В идеале служба должна быть исправлена, чтобы не сообщать о том, что она закончила запуск, пока не закончит запуск. Вы также можете сделать так, чтобы служба выводила файл состояния или что-то, что указывало на завершение запуска, и чтобы ваш пакетный файл дождался его появления, прежде чем двигаться дальше. Или вы можете создать цикл для постоянной повторной проверки статуса сервиса с помощью "net start" или "sc query", пока он не будет отображаться как "Выполняется", если таймауты являются проблемой.

[Править] Что сказал Каран.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .