重啟服務時使批次檔等待服務啟動

重啟服務時使批次檔等待服務啟動

我有一個批次文件,經常重新啟動一組內部開發的服務。我們很快就會從這些轉向更穩定的東西,但目前服務需要經常重新啟動才能正常運作。

為了簡化這一點,我有一個按計劃運行的批次文件。它看起來像這樣:

@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」不斷重新檢查服務狀態,直到它顯示為「正在執行」。

[編輯]卡蘭說的話。

相關內容