Domanda

Come posso scrivere una mazza o un cmd per interrompere e avviare un servizio in modo affidabile con il controllo degli errori (o fatemi sapere che non ha avuto successo per qualsiasi motivo)?

È stato utile?

Soluzione

Usa il comando SC (controllo servizi), ti offre molte più opzioni di un semplice amplificatore 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

Altri suggerimenti

net start [serviceName]

e

net stop [serviceName]

ti dice se hanno avuto successo o fallito abbastanza chiaramente. Ad esempio

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

More help is available by typing NET HELPMSG 3521.

Se in esecuzione da un file batch, si ha accesso a ERRORLEVEL del codice di ritorno. 0 indica successo. Qualsiasi cosa superiore indica un fallimento.

Come file bat, error.bat:

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

L'output è simile al seguente:

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 . . .

Codici di ritorno

 - 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

Modifica il 20.04.2015

Codici di ritorno:

  

Il comando NET non restituisce i codici di ritorno della classe Win32_Service documentati (Servizio non attivo, Timeout richiesta servizio, ecc.) e per molti errori restituirà semplicemente Errorlevel 2.

Guarda qui: http://ss64.com/nt/net_service.html

È possibile utilizzare il comando NET START e quindi controllare la variabile d'ambiente ERRORLEVEL, ad es.

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

Disclaimer: l'ho scritto dalla cima della mia testa, ma penso che funzionerà.

Invece di controllare i codici, funziona anche questo

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

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

Ho creato il mio file batch personale per questo, il mio è un po 'diverso ma sentiti libero di modificarlo come ritieni opportuno. L'ho creato un po 'di tempo fa perché ero annoiato e volevo creare un modo semplice per consentire alle persone di inserire la fine, l'avvio, l'arresto o l'impostazione automatica. Questo file BAT richiede semplicemente di inserire il nome del servizio e farà il resto per te. Non mi rendevo conto che stava cercando qualcosa che affermasse un errore, devo aver letto male quella parte. Anche se in genere questo può essere fatto inserendo & Gt; & Gt; output.txt alla fine della riga.

% var% è solo un modo per consentire all'utente di inserire il proprio servizio in questo, invece di dover modificare il file bat ogni volta che si desidera avviare / arrestare un servizio diverso.

Se sbaglio, chiunque può sentirsi libero di correggermi su questo.

@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

L'uso dei codici di ritorno da net start e net stop mi sembra il metodo migliore. Prova questo: Codici di ritorno Net Start .

La sintassi mi prende sempre .... quindi ...

Ecco esplicitamente come aggiungere una riga a un file batch che ucciderà un servizio remoto (su un altro computer) se sei un amministratore su entrambi i computer, esegui .bat come amministratore e i computer sono sullo stesso dominio. Il nome della macchina segue il formato UNC \ myserver

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

In questo caso ... p4_1 era sia il nome del servizio sia il nome visualizzato, quando si visualizzano le proprietà del servizio in Service Manager. È necessario utilizzare il nome del servizio.

Per i tuoi drogati di Service Ops ... assicurati di aggiungere il tuo codice motivo e commentare! vale a dire "4" che equivale a "Pianificato" e commenta "Arresto del server per manutenzione"

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

Vorremmo pensare che " net stop " interromperà il servizio. Purtroppo, la realtà non è così in bianco e nero. Se il servizio impiega molto tempo per arrestarsi, il comando tornerà prima che il servizio si sia arrestato. Tuttavia, non lo saprai, a meno che non controlli il livello di errore.

La soluzione sembra essere quella di girare in loop cercando lo stato del servizio fino a quando non viene arrestato, con una pausa ogni volta intorno al loop.

Ma poi di nuovo ...

L'arresto del primo servizio richiede molto tempo, quindi il " net stop " per un servizio successivo sembra non fare nulla. Guarda il servizio nel gestore servizi e il suo stato è ancora & Quot; Iniziato & Quot; - nessuna modifica a " Arresto " ;. Tuttavia, posso interrompere manualmente questo secondo servizio utilizzando SCM e si interrompe in 3 o 4 secondi.

oppure puoi avviare il servizio remoto con questo cmd: sc \\<computer> start <service>

Ho appena usato l'esempio di Jonas sopra e ho creato un elenco completo di 0-24 livelli di errore. Altro post è corretto che net start e net stop utilizzano solo errorlevel 0 per il successo e 2 per il fallimento.

Ma questo è ciò che ha funzionato per me:

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%

Cambia stop in start e funziona al contrario.

Il riavvio manuale del servizio è ok - services.msc ha " Riavvia " , ma nella riga di comando sia i comandi sc che net mancano di un " riavvio " switch e se il riavvio è programmato nel file cmd / bat, il servizio viene arrestato e avviato immediatamente, a volte viene visualizzato un errore perché il servizio non è ancora stato arrestato, è necessario del tempo per arrestare le cose.

Questo potrebbe generare un errore: sc stop sc start

È una buona idea inserire il timeout, io uso il ping (esegue il ping ogni 1 secondo): sc stop ping localhost -n 60 sc start

SC può fare tutto con i servizi ... avvio, arresto, controllo, configurazione e altro ...

A volte puoi trovare che la fermata non funziona ..

Talvolta il mio SQlServer lo fa. L'uso della seguente riga di comando lo uccide. Se hai davvero bisogno del tuo script per uccidere cose che non si fermano. Vorrei farlo come ultima risorsa

taskkill /pid [pid number] /f

Ecco il comando di Windows 10 per avviare Ripristino configurazione di sistema tramite batch:

sc config swprv start= Auto

Potrebbero piacerti anche quei comandi:

  • Modifica il valore del registro per avviare automaticamente Ripristino configurazione di sistema

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

  • Crea un punto di ripristino del sistema

    Wmic.exe / Namespace: \ root \ default Path SystemRestore Call CreateRestorePoint " djibe ha salvato il tuo PC " ;, 100, 12

  • Cambia utilizzo del disco di Ripristino configurazione di sistema

    vssadmin ridimensiona shadowstorage / per = C: / on = C: / maxsize = 10%

Godetevi

Sto scrivendo un servizio Windows in C #, il ciclo stop / uninstall / build / install / start è diventato troppo faticoso. Ha scritto un mini script, lo ha chiamato reploy.bat e rilasciato nella mia directory di output di Visual Studio (uno con l'eseguibile del servizio integrato) per automatizzare il ciclo.

Basta impostare questi 3 parametri

servicename: questo appare nel pannello di controllo del servizio Windows (services.msc)

slndir: cartella (non il percorso completo) contenente il file della soluzione (.sln)

binpath: percorso completo (non il percorso della cartella) all'eseguibile del servizio dalla build

NOTA: questo deve essere eseguito dalla riga di comando per sviluppatori di Visual Studio affinché il comando msbuild funzioni.

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%

Forse questo aiuta qualcuno :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top