Frage

Wie kann ich ein Skript für eine bat oder cmd starten und stoppen einen Dienst zuverlässig mit Fehler überprüfen (oder lassen Sie mich wissen, dass es nicht erfolgreich war warum auch immer)?

War es hilfreich?

Lösung

Verwenden Sie die SC (service-control) Befehl, es gibt Ihnen viel mehr Optionen als nur start & stop.

  DESCRIPTION:
          SC is a command line program used for communicating with the
          NT Service Controller and services.
  USAGE:
      sc <server> [command] [service name]  ...

      The option <server> has the form "\\ServerName"
      Further help on commands can be obtained by typing: "sc [command]"
      Commands:
        query-----------Queries the status for a service, or
                        enumerates the status for types of services.
        queryex---------Queries the extended status for a service, or
                        enumerates the status for types of services.
        start-----------Starts a service.
        pause-----------Sends a PAUSE control request to a service.
        interrogate-----Sends an INTERROGATE control request to a service.
        continue--------Sends a CONTINUE control request to a service.
        stop------------Sends a STOP request to a service.
        config----------Changes the configuration of a service (persistant).
        description-----Changes the description of a service.
        failure---------Changes the actions taken by a service upon failure.
        qc--------------Queries the configuration information for a service.
        qdescription----Queries the description for a service.
        qfailure--------Queries the actions taken by a service upon failure.
        delete----------Deletes a service (from the registry).
        create----------Creates a service. (adds it to the registry).
        control---------Sends a control to a service.
        sdshow----------Displays a service's security descriptor.
        sdset-----------Sets a service's security descriptor.
        GetDisplayName--Gets the DisplayName for a service.
        GetKeyName------Gets the ServiceKeyName for a service.
        EnumDepend------Enumerates Service Dependencies.

      The following commands don't require a service name:
      sc <server> <command> <option>
        boot------------(ok | bad) Indicates whether the last boot should
                        be saved as the last-known-good boot configuration
        Lock------------Locks the Service Database
        QueryLock-------Queries the LockStatus for the SCManager Database
  EXAMPLE:
          sc start MyService

Andere Tipps

net start [serviceName]

und

net stop [serviceName]

sagen Sie, ob Sie erfolgreich war oder fehlgeschlagen ist ziemlich klar.Zum Beispiel

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

More help is available by typing NET HELPMSG 3521.

Wenn mit batch-Datei, haben Sie Zugang zu den ERRORLEVEL der Rückgabe-code.0 bedeutet Erfolg.Etwas höheres gibt Fehler.

Wie Sie eine 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 wie folgt 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 . . .

Return-Codes

 - 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

Bearbeiten 20.04.2015

Return-Codes:

Der NET-Befehl nicht zurück dokumentiert Win32_Service-Klasse return-codes (Dienst Nicht Aktiv,Service Request Timeout, etc) und viele Fehler können Sie einfach return Errorlevel 2.

Schau mal hier: http://ss64.com/nt/net_service.html

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

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 geschrieben, das aus der Spitze von meinem Kopf, aber ich denke, es wird funktionieren.

Statt Kontrolle-codes, das funktioniert

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  

Ich habe meine persönliche batch-Datei für dieses, mir ist ein wenig anders, aber fühlen Sie sich frei, um zu ändern, wie Sie sehen, passen.Ich habe dies vor einer Weile, weil ich gelangweilt war, und wollte einen einfachen Weg für die Menschen zu werden in der Lage, die Eingabe beenden, starten, stoppen, oder Einstellung auf auto.Diese BAT-Datei-einfach Anfragen, die Sie eingeben, den service-Namen ein und es wird den rest für Sie.Ich wusste gar nicht, dass er nach etwas suchte, und sagte, jeder Fehler, ich muss Sie falsch verstanden haben, dass ein Teil.Obwohl in der Regel kann dies durch Eingabe von >> output.txt am Ende der Linie.

%Var% ist nur eine Möglichkeit für den Benutzer die Möglichkeit zu geben Ihre eigenen service-in dies, anstatt zu gehen, ändern Sie die bat-Datei jedes mal, wenn Sie wollen, um zu starten/stoppen Sie einen anderen Dienst.

Wenn ich falsch bin, kann jeder fühlen Sie sich frei, mich zu korrigieren, die auf dieser.

@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

Mit der return-codes aus net start und net stop scheint die beste Methode für mich.Versuchen Sie einen Blick auf diese: Net Start return-codes.

Syntax immer bekommt von mir....so...

Hier ist explizit wie fügen Sie eine Zeile in einer batch-Datei, die töten, einen remote-service (auf einem anderen Rechner), wenn Sie ein Administrator auf beiden Computern führen .bat als administrator an, und die Maschinen sind auf der gleichen domain.Die Maschine name folgt der UNC-format \myserver

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

In diesem Fall...p4_1 wurde sowohl die Dienstnamen und die Anzeigenamen, die beim anzeigen der Eigenschaften für den Dienst in Service Manager.Sie müssen den Service-Namen.

Für Ihren Service Ops-junkies...sicher sein, um hängen Sie Ihre Begründung und Kommentar!d.h.'4' entspricht 'Geplant' und Kommentar '- die ein Anhalten des server für die Instandhaltung'

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

Wir möchten zu denken, dass Sie "net stop" - Stoppt das service.Leider, die Realität ist nicht schwarz und weiß.Wenn der Dienst dauert eine lange Zeit zu stoppen, gibt der Befehl zurück, bevor der Dienst beendet wurde.Sie wird nicht wissen, obwohl, es sei denn, Sie überprüfen errorlevel.

Die Lösung scheint es zu sein, Schleife Runde auf der Suche nach dem Stand der service, bis Sie gestoppt wird, mit einer pause jedes mal um die Schleife.

Aber dann wieder...

Ich sehe die ersten service-nehmen eine lange Zeit zu stoppen, dann wird die "net stop" für einen späteren Dienst nur angezeigt wird, nichts zu tun.Schauen Sie sich den Dienst in der Dienste-manager, und sein Status ist immer noch "Gestartet" - kein ändern auf "Beenden".Aber ich kann verhindern, dass diese zweite Dienst manuell mit dem Dienststeuerungs-Manager und hält 3 oder 4 Sekunden.

oder starten Sie remote-service mit diesem cmd : sc \\<computer> start <service>

Habe ich nur verwendet, Jonas' Beispiel oben und erstellt vollständige Liste von 0 bis 24 errorlevels zur Verfügung.Andere post ist richtig, dass net start und net stop verwenden Sie nur errorlevel 0 (bei Erfolg) und 2 für den Ausfall.

Aber das ist was für mich gearbeitet:

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 stop zu start und Umgekehrt funktioniert.

Handbuch Dienst neu starten ist ok - Dienste.msc hat die "Restart" - Taste, aber in der Befehlszeile beide sc und der net-Befehle fehlt ein "Neustart" schalten und neu starten, wenn geplant ist, in cmd/bat-Datei, Dienst wird beendet und begann sofort, manchmal wird es ein Fehler weil der Dienst noch nicht gestoppt, es braucht einige Zeit, um Dinge Herunterfahren.

Dies kann einen Fehler erzeugen:sc stop sc start

Es ist eine gute Idee, legen timeout, habe ich mittels ping (er pingt alle 1 Sekunde):sc stop ping localhost -n 60 sc start

SC kann alles tun, was mit Dienstleistungen...starten, stoppen, kontrollieren, konfigurieren und mehr...

Manchmal finden Sie die stop funktioniert nicht..

My SQL Server manchmal tut das.Mit dem folgenden Befehl tötet.Wenn Sie wirklich wirklich brauchen, Ihr Skript zu töten Sachen, die nicht aufhören.Ich hätte es tun Sie dies als letzten Ausweg

taskkill /pid [pid number] /f

Hier ist die Windows 10 Befehl zum starten der Systemwiederherstellung mithilfe von batch :

sc config swprv start= Auto

Sie können auch wie diese Befehle :

  • Ändern registry-Wert auf auto-start-System wiederherstellen

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

  • Erstellen Sie einen Systemwiederherstellungspunkt

    Wmic.exe /Namespace: oot\default Path SystemRestore Call CreateRestorePoint "djibe Ihrem PC gespeichert", 100, 12

  • Ändern des System-Festplatte Wiederherstellen-Nutzung

    vssadmin resize shadowstorage /for=C:/on=C:/maxsize=10%

Genießen

Ich Schreibe einen windows-Dienst in C#, die stop/deinstallieren/build/install/start loop bekam zu anstrengend.Schrieb ein mini-script, nannte es reploy.bat und fallen gelassen, in meinem Visual Studio-Ausgabe-Verzeichnis (mit dem integrierten service executable) zur Automatisierung der Schleife.

Setzen Sie einfach diesen 3 vars

servicename :dies zeigt sich an den Windows Service control panel (Dienstleistungen.msc)

slndir :Ordner (nicht den vollständigen Pfad) mit Ihrer Lösung (.sln-Datei)

binpath :vollständigen Pfad (nicht den Ordner Pfad) in den Dienst ausführbare Datei aus dem build

HINWEIS:Dies muss ausgeführt werden, von der Visual Studio Developer Command Line für die msbuild der Befehl auch 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 dies ja jemanden :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top