Eu tenho um arquivo em lote que reinicia frequentemente um grupo de serviços desenvolvidos internamente. Em breve estaremos mudando destes para algo mais estável, mas por enquanto os serviços precisam ser reiniciados com bastante frequência para funcionarem corretamente.
Para simplificar isso, tenho um arquivo em lote que é executado de acordo com uma programação. Se parece com isso:
@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
O problema é que, em algumas ocasiões, o arquivo em lote não espera que um serviço termine completamente de iniciar antes de interromper o próximo serviço.
Você acha que adicionar um comando ping localhost adicional após o comando net start pode ajudar?
Responder1
Você pode usar um código como o seguinte para continuar esperando até o serviço (neste caso eu testei comw32time) começou:
: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!
Responder2
Se não houver nenhuma limpeza feita ao parar e eles estiverem executando seu próprio processo, basta encerrar o processo.
Ping
não é a maneira correta de dormir um pouco. Ele carrega a rede. Você tem 3 opções. Todos têm várias opções para mostrar/ocultar coisas.
timeout /t 5
ou
choice /d y /t 5
ou
waitfor /t 5 FredToMarryGinger
Responder3
net start aguardará que o serviço termine de iniciar antes de retornar, portanto, se o arquivo em lote for movido antes de o serviço terminar de iniciar, o problema é com o serviço relatando falsamente que foi iniciado quando não foi iniciado ou demorando tanto que o comando expira.
Idealmente, o serviço deve ser corrigido para não informar que terminou de iniciar até que termine de iniciar. Você também pode fazer com que o serviço gere um arquivo de estado ou algo assim para indicar que a inicialização foi concluída e fazer com que seu arquivo em lote espere que ele apareça antes de prosseguir. Ou você pode criar um loop para verificar continuamente o status do serviço com "net start" ou "sc query" até que seja exibido como "Running", se o problema for o tempo limite.
[Editar] O que Karan disse.