Tengo un archivo por lotes que reinicia frecuentemente un grupo de servicios desarrollados internamente. Pronto nos alejaremos de estos y pasaremos a algo más estable, pero por el momento es necesario reiniciar los servicios con bastante frecuencia para que funcionen correctamente.
Para simplificar esto, tengo un archivo por lotes que se ejecuta según una programación. Se parece a esto:
@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
El problema es que en un par de ocasiones, el archivo por lotes no espera a que un servicio termine de iniciarse por completo antes de detener el siguiente servicio.
¿Cree que agregar un comando ping localhost adicional después del comando net start podría ayudar?
Respuesta1
Puede usar un código como el siguiente para seguir esperando hasta que llegue el servicio (en este caso lo he probado conw32tiempo) Está empezado:
: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!
Respuesta2
Si no se realiza ninguna limpieza al detenerse y se están ejecutando en su propio proceso, simplemente finalice el proceso.
Ping
No es la forma correcta de dormir un poco. Carga la red. Tienes 3 opciones. Todos tienen varias opciones para mostrar/ocultar cosas.
timeout /t 5
o
choice /d y /t 5
o
waitfor /t 5 FredToMarryGinger
Respuesta3
net start esperará a que el servicio termine de iniciarse antes de regresar, por lo que si el archivo por lotes continúa antes de que el servicio termine de iniciarse, el problema es que el servicio informa falsamente que se inició cuando no lo ha hecho, o que el comando tarda tanto en expirar.
Idealmente, el servicio debería arreglarse para que no informe que ha terminado de iniciarse hasta que haya terminado de iniciarse. También puede hacer que el servicio genere un archivo de estado o algo que indique que ha terminado de iniciarse y hacer que su archivo por lotes espere a que aparezca antes de continuar. O puede crear un bucle para volver a verificar continuamente el estado del servicio con "net start" o "sc query" hasta que se muestre como "En ejecución", si el problema son los tiempos de espera.
[Editar] Lo que dijo Karan.