Arresta e avvia un servizio tramite file batch o cmd?

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

Usa il comando SC (controllo servizi), ti offre molte più opzioni che solo start & stop .

   DESCRIZIONE:
           SC è un programma a riga di comando utilizzato per comunicare con
           NT Service Controller e servizi.
   USO:
       sc  [comando] [nome servizio] ...

       L'opzione  ha il formato "\\ ServerName"
       Ulteriori informazioni sui comandi possono essere ottenute digitando: "sc [comando]"
       comandi:
         query ----------- Interroga lo stato di un servizio, o
                         enumera lo stato per i tipi di servizi.
         queryex --------- Esegue una query sullo stato esteso di un servizio, o
                         enumera lo stato per i tipi di servizi.
         start ----------- Avvia un servizio.
         pause ----------- Invia una richiesta di controllo PAUSE a un servizio.
         interrogare ----- Invia una richiesta di controllo INTERROGATE a un servizio.
         continua -------- Invia una richiesta di controllo CONTINUE a un servizio.
         stop ------------ Invia una richiesta STOP a un servizio.
         config ---------- Modifica la configurazione di un servizio (persistente).
         descrizione ----- Cambia la descrizione di un servizio.
         fallimento --------- Modifica le azioni intraprese da un servizio in caso di errore.
         qc -------------- Interroga le informazioni di configurazione per un servizio.
         qdescription ---- Fornisce una descrizione per un servizio.
         qfailure -------- Interroga le azioni eseguite da un servizio in caso di errore.
         delete ---------- Elimina un servizio (dal registro).
         crea ---------- Crea un servizio.  (lo aggiunge al registro).
         control --------- Invia un controllo a un servizio.
         sdshow ---------- Visualizza il descrittore di sicurezza di un servizio.
         sdset ----------- Imposta il descrittore di sicurezza di un servizio.
         GetDisplayName: ottiene DisplayName per un servizio.
         GetKeyName ------ Ottiene ServiceKeyName per un servizio.
         EnumDepend ------ Enumera le dipendenze del servizio.

       I seguenti comandi non richiedono un nome di servizio:
       sc   
         boot ------------ (ok | bad) Indica se l'ultimo avvio dovrebbe
                         essere salvato come ultima configurazione di avvio nota
         Lock ------------ Blocca il database del servizio
         QueryLock ------- Esegue una query su LockStatus per il database SCManager
   ESEMPIO:
           sc avvia MyService
 net start [serviceName] 

e

 net stop [serviceName] 

dirti se hanno avuto successo o fallito abbastanza chiaramente. Per esempio

 U:\>net stop alerter The Alerter service is not started. More help is available by typing NET HELPMSG 3521. 

Se si esegue da un file batch, si ha accesso a ERRORLEVEL del codice di ritorno. 0 indica successo. Qualunque cosa più alta indica 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 a questo:

 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 20.04.2015

Codici di ritorno:

Il comando NET non restituisce i codici restituiti della class Win32_Service documentata (Servizio non attivo, Timeout richiesta di servizio, ecc.) E per molti errori verrà semplicemente restituito Errorlevel 2.

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

È ansible utilizzare il comando NET START e quindi controllare la variabile di 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: Ho scritto questo da cima alla mia testa, ma penso che funzionerà.

Invece di controllare i codici, anche questo funziona

 net start "Apache tomcat" || goto ExitError :End exit 0 :ExitError echo An error has occurred while starting the tomcat services exit 1 

Usare i codici di ritorno da net start e net stop sembra il metodo migliore. Prova a dare un’occhiata a questo: codici di ritorno Net Start .

Ho creato il mio file batch personale per questo, il mio è un po ‘diverso ma non esitate a modificare come meglio credi.

L’ho creato poco fa perché ero annoiato e volevo rendere un modo semplice per le persone di essere in grado 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 qualche errore, devo aver interpretato male quella parte. Anche se in genere questo può essere fatto inserendo >> output.txt alla fine della riga.

Il %var% è solo un modo per l’utente di poter inserire il proprio servizio in questo, invece di dover modificare il file bat ogni volta che si desidera avviare / interrompere un servizio diverso.

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

 @echo off set /pc= 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 /pc= 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 /pc= 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 /pc= 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 

La syntax mi fa sempre …. quindi …

Ecco esplicitamente come aggiungere una riga a un file batch che uccide un servizio remoto (su un’altra macchina) se sei un amministratore su entrambe le macchine, esegui .bat come amministratore e le macchine si trovano 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 che il nome visualizzato, quando si visualizzano le proprietà per il servizio in Service Manager. È necessario utilizzare il nome del servizio.

Per i tuoi drogati di Service Ops, assicurati di aggiungere il tuo codice di motivazione e commentare! cioè ‘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 

Ci piacerebbe pensare che “net stop” fermerà il servizio. Purtroppo, la realtà non è quella in bianco e nero. Se il servizio richiede molto tempo per fermarsi, il comando tornerà prima che il servizio si sia fermato. Non lo saprai, però, a meno che tu non verifichi errorlevel.

La soluzione sembra essere in loop round alla ricerca dello stato del servizio fino a quando non viene interrotta, con una pausa ogni volta intorno al ciclo.

Ma poi di nuovo …

Vedo che il primo servizio richiede molto tempo per fermarsi, quindi la “fermata netta” per un servizio successivo sembra non fare nulla. Guarda il servizio nel gestore servizi, e il suo stato è ancora “Avviato” – nessuna modifica a “Arresto”. Tuttavia, posso interrompere manualmente questo secondo servizio utilizzando SCM e si arresta in 3 o 4 secondi.

oppure puoi avviare il servizio remoto con questo cmd: sc \\ start

Ho appena usato l’esempio di Jonas sopra e ho creato una lista completa di 0 a 24 errorlevels. Altro post è corretto che net start e net stop usano solo errorlevel 0 per successo e 2 per fallimento.

Ma questo è quello 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 per start e funziona al contrario.

Il riavvio del servizio manuale è ok – services.msc ha il pulsante “Riavvia”, ma nella riga di comando entrambi i comandi sc e net mancano di un interruttore “restart” e se il riavvio è pianificato in cmd / bat, il servizio viene fermato e avviato immediatamente, a volte riceve un errore perché il servizio non è stato fermato, ha bisogno di tempo per chiudere le cose.

Ciò potrebbe generare un errore: sc stop sc start

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

SC può fare tutto con i servizi … start, stop, check, configure e altro …

A volte puoi trovare che la fermata non funziona ..

Il mio SQlServer a volte lo fa. Usando il seguente comando lo uccide. Se hai davvero bisogno del tuo script per uccidere cose che non si fermano. Lo farei come ultima risorsa

 taskkill /pid [pid number] /f