2010-05-20 7 views
21

Estoy usando un archivo por lotes para detener un servicio de Windows. Estoy usando el comando sc, pero estoy abierto a otras ideas, dada la siguiente pregunta. El problema es que el archivo por lotes procede mientras que el servicio se detiene (el argumento stop a sc parece que sólo solicitud de la parada - no espere para la parada).¿Detener el archivo por lotes hasta que se complete la parada del servicio?

¿Cómo puedo modificar el archivo por lotes para no proceder hasta que el tope es completa?

Respuesta

25

El uso puede usar NET stop, que es síncrono, es decir, esperará hasta que se detenga el servicio.

Ver - NET stop

+1

stop' Sin embargo 'neta arrojará un error general de código 2 (acceso denegado) si el servicio ya está detenido. – Wernight

+27

Esto no es del todo correcto. Si el servicio tarda, digamos 4 minutos, en detenerse y salir completamente, el comando "net stop" volverá después de 20-40 segundos, pero el proceso de servicio aún no ha finalizado. Devuelve "El servicio no se pudo detener" ... pero esto es engañoso. Al servicio se le ha enviado un comando de detención, pero no ha salido del todo dentro del tiempo de espera de SCM. – Jonesome

2

Creo net stop [Service] debe esperar hasta que el servicio se haya detenido completamente antes de continuar. sc stop [Service] simplemente envía un mensaje de "detención" al servicio.

+1

No es completamente correcto. Por favor, mira mi comentario anterior. – Jonesome

+0

@Jonesome - en lugar de rechazar, ¿por qué no proporcionar una mejor respuesta? – LittleBobbyTables

+0

¡llamada justa! ¡Hecho! El motivo para rechazar votos es que ambas respuestas contienen información incorrecta (probé en win7 y win2008, y sé por experiencia que XP y otros vers se comportarían igual). – Jonesome

11

Como se mencionó anteriormente, NET STOP enviará un comando de detención al servicio, pero, si el servicio toma más de un cierto tiempo (20 segundos más o menos es mi observación), NET STOP NO esperará el servicio en realidad detenerse antes de regresar

Para hacer una pausa en realidad el archivo por lotes hasta que el servicio se detiene, es necesario utilizar un enfoque como los descritos en estos temas:

How to check if a service is running via batch file and start it, if it is not running?

Stopping/Starting a remote Windows service and waiting for it to open/close

+0

No es el infractor (aunque puedo adivinar quién fue), pero esta respuesta es * también * contiene información incorrecta. 'NET STOP' * esperará * a que el servicio se detenga, hasta cierto punto. Nunca he tenido un servicio intenté parar durante los cuatro minutos completos, así que no puedo decir por cuánto tiempo 'NET STOP' espera, pero * espera * un período de tiempo decente, en lugar de' sc stop'. \ – LittleBobbyTables

+0

@LittleBobbyTables La publicación se ha actualizado para dar cuenta de lo que observa. Si observa lo que el equipo de Microsoft escribe (enlace a continuación), verá que el SCM solo habla con un servicio a la vez, por lo que no esperará para siempre ningún servicio. NET SEND es solo una forma de enviar un cmd a SCM, igual que en el administrador de servicios. http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx – Jonesome

+0

Extrayendo un poco más de información del blog vinculado por @Jonesome: la clave de registro que controla el tiempo de espera es 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout'. El valor predeterminado es aparentemente de 20 segundos, pero es de 5 segundos en mi cuadro de Windows 8.1 Enterprise (potencialmente alterado por la política de grupo). – Stajs

1

Este es un poco crudo, pero funcionó para mí, para asegurarme de poder programar un archivo por lotes diario para reiniciar esencialmente un servicio.

PARADA

NET [Servicio]

: TryAgain

TIMEOUT/T 10/NOBREAK

NET START [Servicio]

IF% ERRORLEVEL% NEQ 0 GOTO TryAgain

Me doy cuenta con este fragmento de código que esto podría dar como resultado un ciclo sin fin si el servicio no se inicia correctamente. Simplemente quería mostrar básicamente cómo solucionar el problema utilizando TIMEOUT, donde un servicio puede demorar más de lo que permite el comando NET STOP.

8
sc stop webdriveservice 
:loop 
sc query webdriveservice | find "STOPPED" 
if errorlevel 1 (
    timeout 1 
    goto loop 
) 
0

Utilice el símbolo && entre los comandos. El símbolo && espera para finalizar el comando anterior antes de pasar al siguiente comando.

Todos los comandos deben estar en la misma fila de comando. Puede usar todos los comandos que quiera en una fila.

También puede utilizar el comando pause. Con esto, pide presionar cualquier tecla, antes de proceder al siguiente procedimiento.

Por ejemplo:

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo   [ "MyServiceName" service stopped ] && echo. && pause 
Cuestiones relacionadas