Come riavvio un servizio Windows da uno script?


38

Ho uno script batch che assomiglia a:

sc stop myservice
sc start myservice

si interrompe perché sc non attende fino all'arresto del servizio. Come riavvio un servizio con uno script?


che dire di questo ?
pQd

Risposte:


47

Il poster vuole assicurarsi che il servizio sia interrotto prima di provare a riavviarlo. È possibile utilizzare un ciclo sull'output di "sc query" facendo qualcosa del genere:

: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

8
Buon uso del ping come ritardo.
David Yu,

Grazie, non c'è sonno in batch, quindi è tutto ciò che puoi fare per aspettare :)
crb

4
+1 e un badge GOTO. Assegnato a coloro che usano una dichiarazione GOTO con una faccia seria.
Joseph Kern,

Se solo il batch supportato fa / mentre i loop ... È banale in C #, davvero!
crb

3
In Windows Server 2008, il livello di errore è 0 quando trovato e 1 quando non trovato. Quindi ho dovuto invertire la logica e poi ha funzionato.
Kirk Woll,

26

Potrebbe mancare qualcosa, ma lo uso sempre:

net stop "myservice"
net start "myservice"

o più corto:

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


24

Morto semplice con PowerShell:

PS >Restart-Service MySrvcHere

Ancora meglio, usando i nomi visualizzati:

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

Get-Help Restart-Service per più


6

Se è puramente per riavviare il servizio, è possibile utilizzare

Net stop myservice
Net start myservice

Tuttavia, se si desidera accedere alle opzioni di sc, è possibile utilizzare il comando start / wait

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

questa tecnica è una soluzione più generale che può essere applicata a qualsiasi comando.


sc stop myserviceinvierà semplicemente il comando stop e tornerà prima che il servizio venga arrestato. Chiamare sc con start / b non aiuta.
Jürgen Steinblock,

5

Per avere un riavvio silenzioso di alcuni servizi, che richiede l'arresto delle conferme (come ad esempio il servizio Server), è possibile aggiungere / y alla fine del comando di arresto.

net stop Server /y
net start Server

Sarebbe utile per l'esecuzione automatica degli script.


3

Se si desidera riavviare un servizio non riuscito non è necessario eseguire uno script. Nello snap-in MMC servizi fare clic con il tasto destro su un servizio, selezionare Proprietà, fare clic sulla scheda Ripristino. Qui puoi impostare quali azioni vuoi intraprendere se il servizio si interrompesse. C'è molta flessibilità disponibile. Avrai bisogno di uno script se stai cercando di interrompere il servizio, fare qualcosa, quindi avviare lo script, prefigurare il file batch con net stop "myserviceshortname"e terminare connet start "myserviceshortname"

In vbscipt è un po 'più di codice per arrestare un servizio e i suoi "dipendenti:

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

Qui sta avviando un servizio e tutto ciò da cui dipende (questo dovrebbe essere familiare)

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

1

È possibile utilizzare i seguenti comandi:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.