2010-05-20 19 views
21

Ich verwende eine Batch-Datei, um einen Windows-Dienst zu stoppen. Ich benutze den Befehl sc, aber ich bin offen für andere Ideen, die folgende Frage gegeben. Das Problem ist, dass die Batch-Datei geht während der Dienst stoppen (das stop Argument sc scheint nur zu Anfrage der Anschlag - es funktioniert nicht für den Anschlag warten).Batch-Datei anhalten, bis Service-Stop abgeschlossen ist?

Wie kann ich die Batch-Datei ändern nicht gehen bis zum Anschlag komplette ist?

Antwort

25

Verwendung kann NET stop verwenden, die synchron ist, d. H. Es wird gewartet, bis der Dienst beendet wird.

Siehe - NET stop

+1

jedoch 'net stop' wird ein allgemeiner Fehlercode 2 (Zugriff verweigert) auslösen, wenn der Dienst bereits beendet. – Wernight

+27

Das ist nicht ganz richtig. Wenn der Dienst etwa 4 Minuten benötigt, um tatsächlich vollständig anzuhalten und zu beenden, wird der "Netzstopp" -Befehl nach 20-40 Sekunden zurückkehren, aber der Dienstprozess ist noch nicht beendet. Es kommt zurück "Der Dienst konnte nicht gestoppt werden" ... aber das ist irreführend. Der Dienst HAT einen Stopp-Befehl gesendet, ist aber nicht vollständig innerhalb des SCM-Timeouts beendet worden. – Jonesome

2

Ich glaube net stop [Service] sollte warten, bis der Dienst, bevor sie vollständig zum Stillstand gekommen ist. sc stop [Service] sendet einfach eine "Stop" -Nachricht an den Dienst.

+1

Nicht vollständig korrekt. Bitte beachten Sie meinen Kommentar oben. – Jonesome

+0

@Jonesome - warum nicht eine bessere Antwort geben? – LittleBobbyTables

+0

fairer Anruf! Erledigt! Der Grund für den Downvote ist, dass beide Antworten falsche Informationen enthalten (ich habe auf win7 und win2008 getestet und weiß aus Erfahrung, dass sich XP und andere Spieler gleich verhalten). – Jonesome

11

Wie oben erwähnt, sendet NET STOP einen Stopbefehl an den Dienst, aber wenn der Dienst mehr als eine bestimmte Zeit benötigt (20 Sekunden oder so ist meine Beobachtung), wartet NET STOP NICHT auf den Dienst Stoppen Sie vor der Rückkehr.

Um tatsächlich die Batch-Datei unterbrechen, bis der Dienst beendet wird, müssen Sie einen Ansatz, wie sie in diesen Themen skizziert verwenden:

How to check if a service is running via batch file and start it, if it is not running?

Stopping/Starting a remote Windows service and waiting for it to open/close

+0

Nicht der Downvoter (obwohl ich raten kann wer war), aber diese Antwort enthält * auch * falsche Informationen. 'NET STOP' * wird * warten bis der Dienst anhält, bis zu einem gewissen Punkt. Ich hatte noch nie einen Service, der die ganzen vier Minuten anhielt, also kann ich nicht sagen, wie lange 'NET STOP' wartet, aber * wartet * eine ziemlich lange Zeit, im Gegensatz zu 'sc stop'. \ – LittleBobbyTables

+0

@LittleBobbyTables Der Post wurde aktualisiert, um zu berücksichtigen, was Sie beobachten. Wenn Sie sich ansehen, was das Microsoft-Team schreibt (Link unten), werden Sie sehen, dass der SCM immer nur mit einem Dienst gleichzeitig kommuniziert, so dass es nicht ewig auf irgendeinen Dienst warten wird. NET SEND ist nur eine Möglichkeit, ein Cmd an SCM zu senden, wie im Service Manager. http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx – Jonesome

+0

Aus dem Blog, der von @Jonesome verlinkt wird, ein wenig mehr Informationen herausziehen: der Registrierungsschlüssel, der das Zeitlimit steuert, ist 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout'. Die Standardeinstellung ist scheinbar 20 Sekunden, aber 5 Sekunden in meiner Windows 8.1 Enterprise-Box (möglicherweise durch Gruppenrichtlinien geändert). – Stajs

1

Dies ist eine grobe wenig, aber es funktionierte für mich, um sicherzustellen, dass ich eine tägliche Batch-Datei planen könnte, um einen Dienst im Wesentlichen neu zu starten.

NET STOP [Service]

: TryAgain

TIMEOUT/T 10/NOBREAK

NET START [Service]

IF% ERRORLEVEL% NEQ 0 GOTO TryAgain

Ich erkenne mit diesem Code-Snippet, dass dies zu einer Endlosschleife führen könnte, wenn der Dienst nicht erfolgreich gestartet werden konnte. Ich wollte nur im Grunde zeigen, wie man das Problem mit TIMEOUT umgehen kann, wo ein Dienst länger dauern kann, als der Befehl NET STOP erlaubt.

8
sc stop webdriveservice 
:loop 
sc query webdriveservice | find "STOPPED" 
if errorlevel 1 (
    timeout 1 
    goto loop 
) 
0

Verwenden Sie das Symbol && zwischen den Befehlen. Das && Symbol wartet, um den vorherigen Befehl zu beenden, bevor mit dem nächsten Befehl fortgefahren wird.

Alle Befehle müssen sich in derselben Befehlszeile befinden. Sie können beliebig viele Befehle hintereinander verwenden.

Sie können auch den Befehl pause verwenden. Fordert Sie dazu auf, eine beliebige Taste zu drücken, bevor Sie mit dem nächsten Vorgang fortfahren.

Zum Beispiel:

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo   [ "MyServiceName" service stopped ] && echo. && pause 
Verwandte Themen