¿Cómo reinicio un servicio de Windows desde un script?

38

Tengo un script por lotes que se parece a:

sc stop myservice
sc start myservice

se equivoca porque sc no espera hasta que se detenga el servicio. ¿Cómo reinicio un servicio con un script?

Joshua
fuente
¿Qué hay de este ?
pQd

Respuestas:

47

El póster quiere asegurarse de que el servicio se detenga antes de intentar reiniciarlo. Puede usar un bucle en la salida de "sc query" haciendo algo como esto:

:stop
sc stop myservice

rem cause a ~10 second sleep before checking the service state
ping 127.0.0.1 -n 10 -w 1000 > nul

sc query myservice | find /I "STATE" | find "STOPPED"
if errorlevel 1 goto :stop
goto :start

:start
net start | find /i "My Service">nul && goto :start
sc start myservice
crb
fuente
8
Buen uso de ping como retraso de tiempo.
David Yu
Gracias, no hay sueño en lotes así que eso es todo lo que puede hacer que esperar :)
CRB
44
+1 y una insignia GOTO. Otorgado a aquellos que usan una declaración GOTO con una cara seria.
Joseph Kern
Si solo se admiten lotes de bucles do / while ... ¡Es trivial en C #, realmente!
crb
3
En Windows Server 2008, el nivel de error es 0 cuando se encuentra y 1 cuando no se encuentra. Así que tuve que invertir la lógica y luego funcionó.
Kirk Woll
26

Puede faltar algo, pero lo uso todo el tiempo:

net stop "myservice"
net start "myservice"

o más corto:

net stop "myservice" && net start "myservice"

Skawt
fuente
24

Muy simple con powershell:

PS >Restart-Service MySrvcHere

Aún mejor, usando nombres para mostrar:

PS >Restart-Service -displayname "My Service Name Here"

Get-Help Restart-Service para más

Factor místico
fuente
6

Si es solo para reiniciar el servicio, puede usar

Net stop myservice
Net start myservice

Sin embargo, si desea acceder a las opciones de sc, puede usar el comando start / wait

start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"

Esta técnica es una solución más general que se puede aplicar a cualquier comando.

Peter Stuer
fuente
sc stop myservicesolo enviará el comando de detención y regresará antes de que se detenga el servicio. Llamar a sc con start / b no ayudará.
Jürgen Steinblock
5

Para tener un reinicio silencioso de algún servicio, que solicita que se detengan las confirmaciones (como el servicio del servidor, por ejemplo), puede agregar / y al final del comando de detención.

net stop Server /y
net start Server

Sería útil para la ejecución automática de scripts.

Fedir RYKHTIK
fuente
3

Si desea reiniciar un servicio fallido, no necesita ejecutar un script. En los servicios MMC, haga clic derecho en un servicio, seleccione propiedades, haga clic en la pestaña de recuperación. Aquí puede establecer qué acciones desea que se realicen si el servicio se detiene. Hay mucha flexibilidad disponible. Necesitará una secuencia de comandos si está tratando de detener el servicio, haga algo y luego inicie la secuencia de comandos, introduzca el archivo por lotes net stop "myserviceshortname"y termine connet start "myserviceshortname"

En vbscipt es un poco más de código para detener un servicio y sus dependientes:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For each objService in colServiceList
    objService.StopService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='myservice'")
For each objService in colServiceList
    errReturn = objService.StopService()
Next

Aquí está comenzando un servicio y cualquier cosa de la que dependa (esto debería ser familiar)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name='Myservice'")
For each objService in colServiceList
    errReturn = objService.StartService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Dependent" )
For each objService in colServiceList
    objService.StartService()
Next
Jim B
fuente
1

Puede usar los siguientes comandos:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Ganesh
fuente