重新启动服务时让批处理文件等待服务启动

重新启动服务时让批处理文件等待服务启动

我有一个批处理文件,它经常重新启动一组内部开发的服务。我们很快就会放弃这些服务,转而使用更稳定的服务,但目前这些服务需要经常重新启动才能正常工作。

为了简化这一过程,我有一个按计划运行的批处理文件。它看起来像这样:

@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”不断重新检查服务状态,直到它显示为“正在运行”。

[编辑] 卡兰说了什么。

相关内容