서비스를 다시 시작할 때 배치 파일이 서비스가 시작될 때까지 기다리도록 합니다.

서비스를 다시 시작할 때 배치 파일이 서비스가 시작될 때까지 기다리도록 합니다.

사내에서 개발된 서비스 그룹을 자주 다시 시작하는 배치 파일이 있습니다. 우리는 곧 이러한 것에서 더 안정적인 것으로 전환할 예정이지만, 당분간 서비스가 제대로 작동하려면 꽤 자주 다시 시작해야 합니다.

이를 단순화하기 위해 일정에 따라 실행되는 배치 파일이 있습니다. 다음과 같습니다:

@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

문제는 배치 파일이 다음 서비스를 중지하기 전에 한 서비스의 시작이 완전히 완료될 때까지 기다리지 않는 경우가 몇 번 있다는 것입니다.

net start 명령 뒤에 추가 ping localhost 명령을 추가하는 것이 도움이 될 것이라고 생각하십니까?

답변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"를 사용하여 서비스 상태를 지속적으로 다시 확인하는 루프를 만들 수 있습니다.

[편집] Karan이 말한 것.

관련 정보