Faz com que o arquivo em lote espere que o serviço seja iniciado ao reiniciar os serviços

4

Eu tenho um arquivo de lote que freqüentemente reinicia um grupo de serviços desenvolvidos internamente. Em breve, estamos nos afastando deles para algo mais estável, mas, por enquanto, os serviços precisam ser reiniciados com bastante frequência para funcionar adequadamente.

Para simplificar isso, eu tenho um arquivo em lotes que é executado em um agendamento. Parece assim:

@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 o início 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?

    
por Brian 21.05.2015 / 23:26

3 respostas

3

Você pode usar um código como o seguinte para continuar aguardando até que o serviço (neste caso eu testei com w32time ) seja iniciado:

: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!
    
por 22.05.2015 / 00:07
1

Se não houver limpeza feita ao parar e eles estiverem executando em seu próprio processo, apenas mate o processo.

Ping não é a maneira correta de ter um pouco de sono. 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
    
por 22.05.2015 / 02:00
0

net start esperará que o serviço termine de começar antes de retornar, portanto, se o arquivo de lote for movido antes que o serviço termine, o problema é que o serviço relata falsamente quando é iniciado, ou demora o comando vezes fora.

Idealmente, o serviço deve ser corrigido para não reportar que tenha terminado de começar até que tenha terminado de iniciar. Você também pode fazer com que o serviço exiba um arquivo de estado ou algo para indicar que ele foi concluído e que seu arquivo de 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 ele seja exibido como "Em execução", se os tempos limite forem o problema.

[Editar] O que Karan disse.

    
por 22.05.2015 / 00:07