У меня есть пакетный файл, который часто перезапускает группу служб, разработанных в доме. Мы скоро перейдем от них к чему-то более стабильному, но на данный момент службы нужно перезапускать довольно часто, чтобы они работали правильно.
Для упрощения у меня есть пакетный файл, который запускается по расписанию. Он выглядит так:
@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", если проблема в тайм-аутах.
[Изменить] Что сказал Каран.