it-swarm.com.de

Beenden und Starten eines Dienstes über Batch- oder Cmd-Datei?

Wie kann ich ein Fledermaus oder ein Cmd-Skript schreiben, um einen Dienst mit Fehlerprüfung zuverlässig anzuhalten und zu starten (oder mir mitteilen, dass er aus irgendeinem Grund nicht erfolgreich war)?

264
Keng

Verwenden Sie den Befehl SC (Dienststeuerung). Dadurch haben Sie viel mehr Optionen als nur start & stop.

 BESCHREIBUNG:
 SC ist ein Befehlszeilenprogramm für die Kommunikation mit der 
 NT Service Controller und Dienste .
 VERWENDUNGSZWECK:
 sc <Server> [Befehl] [Dienstname] ...

 Die Option <Server> hat die Form "\\ Servername" 
 Weitere Hilfe zu Befehlen erhalten Sie durch Eingabe von: "sc [Befehl]" 
 Befehle: 
 query ----------- Fragt den Status eines Dienstes ab oder 
 listet den Status für Diensttypen auf. queryex --------- Fragt den erweiterten Status für einen Dienst ab oder 
 listet den Status für Diensttypen auf. start ----------- Startet einen Dienst .
 pause ----------- Sendet eine PAUSE-Steuerungsanforderung an einen Dienst .
 abfragen ----- Sendet eine INTERROGATE-Steuerungsanforderung an einen Dienst .
 fortsetzen -------- Sendet eine CONTINUE-Steuerungsanforderung an einen Dienst .
 stop ------------ Sendet eine STOP-Anforderung an einen Dienst .
 config ---------- Ändert die Konfiguration eines Dienstes (persistent) .
 description ----- Ändert die Beschreibung eines Dienstes .
 failure --------- Ändert die Aktionen, die von einem Dienst bei einem Fehler ausgeführt werden .
 qc -------------- fragt die Konfigurationsinformationen für einen Dienst ab .
 qdescription ---- Fragt die Beschreibung für einen Dienst ab .
 qfailure -------- Fragt die Aktionen ab, die von einem Dienst bei einem Fehler ausgeführt werden .
 delete ---------- Löscht einen Dienst (aus der Registrierung) .
 create ---------- Erstellt einen Dienst. (fügt es der Registrierung hinzu) .
 control --------- Sendet eine Kontrolle an einen Dienst .
 sdshow ---------- Zeigt die Sicherheitsbeschreibung eines Dienstes an .
 sdset ----------- Legt die Sicherheitsbeschreibung eines Dienstes fest .
 GetDisplayName - Ruft den DisplayName für einen Dienst ab. GetKeyName ------ Ruft den ServiceKeyName für einen Dienst ab. EnumDepend ------ listet Dienstabhängigkeiten auf .

 Die folgenden Befehle erfordern keinen Dienstnamen: 
 sc <Server> <Befehl> <Option> 
 boot ------------ (ok | bad) Gibt an, ob der letzte Startvorgang erfolgen soll 
 als zuletzt als bekannt bekannte Boot-Konfiguration gespeichert werden 
 Sperren ------------ Sperrt die Servicedatenbank 
 QueryLock ------- Fragt den LockStatus für die SCManager-Datenbank ab 
 BEISPIEL:
 sc Start MyService 
326
Ferruccio
net start [serviceName]

und

net stop [serviceName]

sagen Sie, ob sie erfolgreich waren oder ziemlich gescheitert sind. Zum Beispiel

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

Wenn Sie von einer Batchdatei aus arbeiten, haben Sie Zugriff auf den ERRORLEVEL des Rückkehrcodes. 0 zeigt Erfolg an. Alles, was höher ist, zeigt einen Ausfall an.

Als bat-Datei error.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

Die Ausgabe sieht folgendermaßen aus:

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

Rückgabecodes

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

Edit 20.04.2015

Rückgabecodes: 

Der Befehl NET gibt die dokumentierten Rückgabecodes der Klasse Win32_Service (Dienst nicht aktiv, Zeitlimit für Dienstanfragen usw.) nicht zurück. Bei vielen Fehlern wird einfach Errorlevel 2 zurückgegeben.

Schauen Sie hier: http://ss64.com/nt/net_service.html

193
Bill Michell

Sie können den Befehl NET START verwenden und dann die Umgebungsvariable ERRORLEVEL überprüfen, z.

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Haftungsausschluss: Ich habe dies aus meinem Kopf geschrieben, aber ich denke, es wird funktionieren.

27
Jonas Gulle

Anstatt Codes zu überprüfen, funktioniert dies auch

net start "Apache Tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the Tomcat services  
exit 1  
8
vanval

Ich habe meine persönliche Batch-Datei dafür erstellt, meine ist ein bisschen anders, aber ich kann sie nach Belieben ändern .. Ich habe sie vor einiger Zeit erstellt, weil mir langweilig war und ich den Leuten einen einfachen Weg machen wollte Ending, Start, Stop oder Einstellung auf auto. Diese BAT-Datei fordert Sie einfach auf, den Dienstnamen einzugeben, und den Rest erledigt er für Sie. Ich wusste nicht, dass er nach etwas suchte, das einen Fehler aussagte. Ich muss diesen Teil falsch verstanden haben. Dies kann normalerweise durch Eingabe von >> output.txt am Ende der Zeile erfolgen. 

% Var% ist nur eine Möglichkeit für den Benutzer, seinen eigenen Dienst in dieses Feld einzugeben, anstatt die bat-Datei jedes Mal ändern zu müssen, wenn Sie einen anderen Dienst starten oder stoppen möchten. 

Wenn ich falsch liege, kann sich jeder frei dazu äußern. 

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto
7

Die Rückkehrcodes von net start und net stop zu verwenden, scheint mir die beste Methode zu sein. Probieren Sie dies aus: Net Start-Rückkehrcodes .

6
ZombieSheep

Syntax holt mich immer so .... so ...

Hier wird explizit beschrieben, wie Sie einer Batchdatei eine Zeile hinzufügen, die einen Remote-Dienst (auf einem anderen Computer) beendet, wenn Sie auf beiden Computern Administrator sind und die .bat als Administrator ausführen und die Computer sich in derselben Domäne befinden. Der Rechnername folgt dem UNC-Format\myserver

sc \\ip.ip.ip.ip stop p4_1

In diesem Fall war ... p4_1 sowohl der Dienstname als auch der Anzeigename, wenn Sie die Eigenschaften für den Dienst in Service Manager anzeigen. Sie müssen den Dienstnamen verwenden.

Für Ihre Service Ops-Junkies ... fügen Sie Ihren Begründungscode und Kommentar hinzu! "4", was "Geplant" entspricht, und "Server für Wartung stoppen".

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
5
ATSiem

Wir würden gerne glauben, dass "net stop" den Dienst stoppt. Leider ist die Realität nicht so schwarz und weiß. Wenn der Dienst längere Zeit zum Stoppen benötigt, wird der Befehl zurückgegeben, bevor der Dienst gestoppt wurde. Sie werden es jedoch nicht wissen, es sei denn, Sie überprüfen den Errorlevel.

Die Lösung scheint zu sein, in einer Schleife nach dem Status des Dienstes zu suchen, bis er gestoppt wird, wobei jede Runde um die Schleife eine Pause einzulegen.

Aber dann wieder...

Ich sehe, dass der erste Dienst lange braucht, um anzuhalten, dann scheint der "Netzstopp" für einen nachfolgenden Dienst einfach nichts zu tun. Sehen Sie sich den Dienst im Dienstemanager an, und sein Status ist immer noch "Gestartet" - keine Änderung an "Stoppen". Ich kann diesen zweiten Dienst jedoch manuell mit dem SCM beenden, und er wird in 3 oder 4 Sekunden angehalten.

4
DaveH

oder Sie können den Remote-Dienst mit diesem Befehl starten: sc \\<computer> start <service>

3
onionpsy

Manueller Dienstneustart ist in Ordnung - services.msc hat die Schaltfläche "Neustart", aber in der Befehlszeile fehlt den Befehlen "sc" und "net" ein Schalter für den Neustart. Wenn der Neustart in der cmd/bat-Datei geplant ist, wird der Dienst angehalten und manchmal sofort gestartet Es wird ein Fehler angezeigt, da der Dienst noch nicht angehalten wurde. Es dauert einige Zeit, um die Server herunterzufahren. 

Dies kann zu einem Fehler führen: Sc stop Sc start 

Es ist eine gute Idee, das Timeout einzufügen. Ich benutze Ping (es pingt alle 1 Sekunde): Sc stop Ping localhost -n 60sc start 

2
Kuleris

Ich habe gerade Jonas 'Beispiel oben verwendet und eine vollständige Liste von 0 bis 24 Fehlerstufen erstellt. Andere Post ist richtig, dass net start und net stop nur errorlevel 0 für Erfolg und 2 für Fehler verwenden.

Aber das hat bei mir funktioniert:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

Ändern Sie stop in start und arbeiten Sie umgekehrt.

2
Clinton

SC kann alles mit Diensten machen ... starten, stoppen, prüfen, konfigurieren und vieles mehr ... 

1
Axeman

Manchmal kann man feststellen, dass die Haltestelle nicht funktioniert. 

Mein SQL Server tut dies manchmal. Mit der folgenden Befehlszeile wird es beendet. Wenn Sie wirklich Ihr Skript brauchen, um Sachen zu töten, hört das nicht auf. Ich würde es als letzten Ausweg tun

taskkill /pid [pid number] /f
1
andrew pate

Hier der Windows 10-Befehl zum Starten der Systemwiederherstellung mit Batch:

sc config swprv start= Auto

Sie können auch diese Befehle mögen:

  • Ändern Sie den Registrierungswert, um die Systemwiederherstellung automatisch zu starten

    REG Hinzufügen "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore"/v DisableSR/t REG_DWORD/d 0/f

  • Erstellen Sie einen Systemwiederherstellungspunkt

    Wmic.exe/Namespace:\root\default Pfad SystemRestore Aufruf CreateRestorePoint "DJ hat Ihren PC gespeichert", 100, 12

  • Ändern Sie die Nutzung der Systemwiederherstellungsdiskette

    vssadmin Größe des Schattenspeichers ändern/für = C:/on = C:/maxsize = 10%

Genießen

1
djibe

Ich schreibe einen Windows-Dienst in C #, die Stop/uninstall/build/install/start-Schleife wurde zu anstrengend. Schrieb ein Mini-Skript, nannte es reploy.bat und legte es in meinem Visual Studio-Ausgabeverzeichnis ab (eines, das über die erstellte ausführbare Datei verfügt), um die Schleife zu automatisieren. 

Stellen Sie einfach diese 3 Werte ein 

servicename: Dies wird in der Windows-Dienststeuerung (services.msc) angezeigt.

slndir: Ordner (nicht der vollständige Pfad), der Ihre Lösungsdatei (.sln) enthält

binpath: vollständiger Pfad (nicht der Ordnerpfad) zur ausführbaren Dienstdatei des Builds

ANMERKUNG: Dies muss von der Visual Studio Developer-Befehlszeile aus ausgeführt werden, damit der Befehl msbuild funktioniert.

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

Vielleicht hilft das jemandem :)

0
sh87