Como reinicio um serviço do Windows a partir de um script?

38

Eu tenho um script em lote que se parece com:

sc stop myservice
sc start myservice

erros porque o sc não espera até que o serviço seja interrompido. Como reinicio um serviço com um script?

Joshua
fonte
que tal isso ?
pQd

Respostas:

47

O pôster deseja garantir que o serviço seja interrompido antes de tentar reiniciá-lo. Você pode usar um loop na saída da "consulta sc" fazendo algo como isto:

: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
fonte
8
Bom uso de ping como um atraso de tempo.
David Yu
Graças, não há sono em lote de modo que é tudo o que você pode fazer para esperar :)
crb
4
+1 e um emblema GOTO. Concedido para aqueles que usam uma declaração GOTO com uma cara séria.
31413 Joseph Kern
Se apenas o lote suportar loops de do / while ... É trivial em C #, realmente!
Crb #
3
No Windows Server 2008, o nível de erro é 0 quando encontrado e 1 quando não encontrado. Então tive que inverter a lógica e funcionou.
21411 Kirk Woll
26

Pode estar faltando alguma coisa, mas eu uso isso o tempo todo:

net stop "myservice"
net start "myservice"

ou mais curto:

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

Skawt
fonte
24

Simplesmente morto com PowerShell:

PS >Restart-Service MySrvcHere

Melhor ainda, usando nomes de exibição:

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

Get-Help Restart-Service para mais

Fator Místico
fonte
6

Se for apenas para reiniciar o serviço, você pode usar

Net stop myservice
Net start myservice

No entanto, se você quiser acessar as opções de sc, poderá usar o comando start / wait

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

essa técnica é uma solução mais geral que pode ser aplicada a qualquer comando.

Peter Stuer
fonte
sc stop myserviceapenas enviará o comando stop e retornará antes que o serviço seja interrompido. Chamar sc com start / b não ajudará.
Jürgen Steinblock
5

Para reiniciar silenciosamente algum serviço, que solicita que as confirmações sejam interrompidas (como serviço do servidor, por exemplo), você pode adicionar / y ao final do comando stop.

net stop Server /y
net start Server

Seria útil para execução automática de script.

Fedir RYKHTIK
fonte
3

Se você deseja reiniciar um serviço com falha, não precisa executar um script. No snap-in do MMC de serviços, clique com o botão direito do mouse em um serviço, selecione propriedades, clique na guia recuperação. Aqui você pode definir quais ações você deseja que o serviço seja interrompido. Há muita flexibilidade disponível. Você precisará de um script se estiver tentando parar o serviço, faça algo e inicie o script, anteceda o arquivo em lotes net stop "myserviceshortname"e termine comnet start "myserviceshortname"

No vbscipt, é um pouco mais de código para interromper um serviço e seus 'dependentes:

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

Aqui está iniciando um serviço e tudo o que depende (isso deve 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
fonte
1

Você pode usar os seguintes comandos:

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