Frage Wie starte ich einen Windows-Dienst von einem Skript neu?


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 gestoppt wird. Wie starte ich einen Dienst mit einem Skript neu?


35
2018-06-12 22:48


Ursprung


wie wäre es mit diese? - pQd


Antworten:


Das Poster möchte sicherstellen, dass der Dienst gestoppt wird, bevor es neu gestartet wird. Sie können eine Schleife für die Ausgabe von "sc query" verwenden, indem Sie Folgendes 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

45
2018-06-12 22:54



Nette Verwendung von Ping als Zeitverzögerung. - David Yu
Danke, es gibt keinen Schlaf im Batch, also ist alles was du tun kannst um zu warten :) - crb
+1 und ein GOTO-Abzeichen. Verliehen an diejenigen, die eine GOTO-Anweisung mit einem klaren Gesicht verwenden. - Joseph Kern
Wenn nur Batch-Do / While-Schleifen unterstützt werden ... Es ist trivial in C #, wirklich! - crb
In Windows Server 2008 ist die Fehlerstufe 0 wenn gefunden und 1 wenn nicht gefunden. Also musste ich die Logik invertieren und dann funktionierte es. - Kirk Woll


Vielleicht fehlt etwas, aber ich benutze es die ganze Zeit:

Netzstop "myservice"
  Netto Start "Mein Service"

oder kürzer:

net stop "myservice" && net starten "myservice"


24
2018-06-13 00:23





Tot einfach mit Powershell:

PS >Restart-Service MySrvcHere

Noch besser, mit Anzeigenamen:

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

Get-Help Restart-Service für mehr


21
2018-06-13 08:50





Wenn es nur für den Neustart des Dienstes ist, 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.


5
2018-06-13 09:29



sc stop myservice sendet nur den Befehl stop und kehrt zurück, bevor der Dienst gestoppt wird. Das Aufrufen von sc mit Start / b wird nicht helfen. - Jürgen Steinblock


Haben ruhig Neustart eines Dienstes, der das Beenden von Bestätigungen fordert (z. B. Serverdienst), könnte hinzugefügt werden / y bis zum Ende des Stoppbefehls.

net stop Server /y
net start Server

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


4
2018-05-20 14:55





Wenn Sie einen fehlgeschlagenen Dienst neu starten möchten, müssen Sie kein Skript ausführen. Klicken Sie mit der rechten Maustaste im Dienste-MMC auf einen Dienst, wählen Sie Eigenschaften aus und klicken Sie auf die Wiederherstellungsregisterkarte. Hier können Sie festlegen, welche Aktionen ausgeführt werden sollen, wenn der Dienst beendet wird. Es ist viel Flexibilität verfügbar. Sie benötigen ein Skript, wenn Sie versuchen, den Dienst zu stoppen, etwas zu tun, dann das Skript zu starten und die Batch-Datei mit einzubetten net stop "myserviceshortname" und enden mit net start "myserviceshortname"

In VBScript ist es ein wenig mehr Code, um einen Dienst und seine Abhängigkeiten 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 starten Sie einen Service und alles, worauf es ankommt (das sollte Ihnen bekannt 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

2
2018-06-13 03:22





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>

0
2018-02-26 06:59