Faça o arquivo em lote aguardar o início do serviço ao reiniciar os serviços

Faça o arquivo em lote aguardar o início do serviço ao reiniciar os serviços

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.

Pingnã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.

informação relacionada