Заставить пакетный файл ждать запуска службы при перезапуске служб

Заставить пакетный файл ждать запуска службы при перезапуске служб

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

Для упрощения у меня есть пакетный файл, который запускается по расписанию. Он выглядит так:

@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?

решение1

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

: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

решение3

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

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

[Изменить] Что сказал Каран.

Связанный контент