Ich habe eine Batchdatei, die eine Gruppe von intern entwickelten Diensten häufig neu startet. Wir werden bald von diesen auf etwas Stabileres umsteigen, aber vorerst müssen die Dienste ziemlich oft neu gestartet werden, damit sie richtig funktionieren.
Um das zu vereinfachen, habe ich eine Batchdatei, die nach einem Zeitplan ausgeführt wird. Sie sieht folgendermaßen aus:
@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
Das Problem besteht darin, dass die Batchdatei in einigen Fällen nicht wartet, bis ein Dienst vollständig gestartet ist, bevor sie den nächsten Dienst stoppt.
Glauben Sie, dass es hilfreich sein könnte, nach dem Befehl „Net Start“ einen zusätzlichen Befehl „Ping Localhost“ hinzuzufügen?
Antwort1
Sie können Code wie den folgenden verwenden, um weiter zu warten, bis der Dienst (in diesem Fall habe ich getestet mitw32zeit) ist gestartet:
: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!
Antwort2
Wenn beim Stoppen keine Bereinigung durchgeführt wird und die Programme in ihrem eigenen Prozess ausgeführt werden, beenden Sie einfach den Prozess.
Ping
ist nicht die richtige Art, ein bisschen zu schlafen. Es belastet das Netzwerk. Sie haben 3 Möglichkeiten. Alle haben verschiedene Optionen zum Anzeigen/Verbergen von Inhalten.
timeout /t 5
oder
choice /d y /t 5
oder
waitfor /t 5 FredToMarryGinger
Antwort3
netstart wartet, bis der Dienst vollständig gestartet ist, bevor es zurückkehrt. Wenn die Batchdatei also fortfährt, bevor der Dienst vollständig gestartet ist, liegt das Problem darin, dass der Dienst fälschlicherweise meldet, dass er gestartet wurde, obwohl dies nicht der Fall ist, oder dass es so lange dauert, bis der Befehl abläuft.
Idealerweise sollte der Dienst so eingestellt werden, dass er den Abschluss des Startvorgangs erst meldet, wenn er abgeschlossen ist. Sie können den Dienst auch eine Statusdatei oder etwas Ähnliches ausgeben lassen, um anzuzeigen, dass der Startvorgang abgeschlossen ist, und Ihre Batchdatei warten lassen, bis diese angezeigt wird, bevor sie fortfährt. Oder Sie können eine Schleife erstellen, um den Dienststatus mit „net start“ oder „sc query“ kontinuierlich erneut zu überprüfen, bis er als „Wird ausgeführt“ angezeigt wird, wenn Timeouts das Problem sind.
[Bearbeiten] Was Karan gesagt hat.