Wie starte ich einen Windows-Dienst über ein Skript neu?

38

Ich habe ein Batch-Skript, das wie folgt aussieht:

sc stop myservice
sc start myservice

Es tritt ein Fehler auf, weil sc nicht wartet, bis der Dienst beendet wird. Wie starte ich einen Dienst mit einem Skript neu?

Joshua
quelle
was ist damit ?
pQd

Antworten:

47

Das Poster möchte sicherstellen, dass der Dienst beendet wird, bevor versucht wird, ihn neu zu starten. Sie können eine Schleife an der Ausgabe von "sc query" verwenden, um Folgendes zu tun:

: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
quelle
8
Nizza Verwendung von Ping als Zeitverzögerung.
David Yu
Danke, es gibt keinen Schlaf im Batch, das ist alles, was Sie tun können, um zu warten :)
crb
4
+1 und ein GOTO-Abzeichen. Verliehen an Personen, die eine GOTO-Anweisung mit ernstem Gesicht verwenden.
Joseph Kern
Wenn nur Batch-Do / While-Schleifen unterstützt werden ... Das ist in C # wirklich trivial!
13.06.09
3
In Windows Server 2008 ist die Fehlerstufe 0, wenn sie gefunden wird, und 1, wenn sie nicht gefunden wird. Also musste ich die Logik umkehren und dann funktionierte es.
Kirk Woll
26

Möglicherweise fehlt etwas, aber ich benutze dies die ganze Zeit:

net stop "myservice"
net start "myservice"

oder kürzer:

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

Skawt
quelle
24

Ganz einfach mit Powershell:

PS >Restart-Service MySrvcHere

Noch besser, wenn Sie Anzeigenamen verwenden:

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

Get-Help Restart-Service für mehr

Factor Mystic
quelle
6

Wenn es nur zum Neustarten des Dienstes dient, können Sie verwenden

Net stop myservice
Net start myservice

Wenn Sie jedoch auf die Optionen von sc zugreifen möchten, können Sie den Befehl start / wait verwenden

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

Diese Technik ist eine allgemeinere Lösung, die auf jeden Befehl angewendet werden kann.

Peter Stuer
quelle
sc stop myserviceSendet einfach den Befehl stop und kehrt zurück, bevor der Dienst beendet wird. Es hilft nicht, sc mit start / b aufzurufen.
Jürgen Steinblock
5

Um einen leisen Neustart eines Dienstes zu erhalten, bei dem zum Beenden aufgefordert wird (z. B. als Serverdienst), können Sie am Ende des Stoppbefehls / y hinzufügen .

net stop Server /y
net start Server

Es wäre hilfreich für die automatische Skriptausführung.

Fedir RYKHTIK
quelle
3

Wenn Sie einen fehlgeschlagenen Dienst neu starten möchten, müssen Sie kein Skript ausführen. Klicken Sie im MMC-Snap-In für Dienste mit der rechten Maustaste auf einen Dienst, wählen Sie Eigenschaften aus und klicken Sie auf die Registerkarte Wiederherstellung. Hier können Sie festlegen, welche Aktionen Sie ausführen möchten, wenn der Dienst beendet wird. Es steht eine Menge Flexibilität zur Verfügung. Sie benötigen ein Skript, wenn Sie versuchen, den Dienst zu beenden, etwas zu tun und dann das Skript zu starten, die Batch-Datei mit einem Vorwort zu versehen net stop "myserviceshortname"und mit zu beendennet start "myserviceshortname"

In vbscipt ist es ein bisschen mehr Code, um einen Dienst und seine abhängigen Elemente zu stoppen:

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

Hier wird ein Dienst gestartet und alles, wovon es abhängt (dies sollte vertraut sein)

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
quelle
1

Sie können die folgenden Befehle verwenden:

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