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?


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

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"


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


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.


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.


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

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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.