我有一個批次文件,經常重新啟動一組內部開發的服務。我們很快就會從這些轉向更穩定的東西,但目前服務需要經常重新啟動才能正常運作。
為了簡化這一點,我有一個按計劃運行的批次文件。它看起來像這樣:
@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」不斷重新檢查服務狀態,直到它顯示為「正在執行」。
[編輯]卡蘭說的話。