Interrompere e avviare un servizio tramite file batch o cmd?


288

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


Forse un po 'offtopico (poiché chiedi istruzioni bat & cmd) ma: PowerShell ti dà un sacco di controllo e feedback per fare azioni come questa.
GvS,

Risposte:


347

Usa il SCcomando (controllo servizi), ti offre molte più opzioni rispetto al solo start& stop.

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

      L'opzione <server> ha il formato "\\ ServerName"
      Ulteriore aiuto sui comandi può essere ottenuto digitando: "sc [comando]"
      comandi:
        query ----------- Interroga lo stato di un servizio o
                        enumera lo stato per i tipi di servizi.
        queryex --------- Interroga lo stato esteso per un servizio, oppure
                        enumera lo stato per i tipi di servizi.
        start ----------- Avvia un servizio.
        pause ----------- Invia una richiesta di controllo PAUSE a un servizio.
        interrogate ----- Invia una richiesta di controllo INTERROGATE a un servizio.
        continua -------- Invia una richiesta di controllo CONTINUA a un servizio.
        stop ------------ Invia una richiesta STOP a un servizio.
        config ---------- Modifica la configurazione di un servizio (persistente).
        descrizione ----- Modifica la descrizione di un servizio.
        fallimento --------- Modifica le azioni intraprese da un servizio in caso di guasto.
        qc -------------- Interroga le informazioni di configurazione per un servizio.
        qdescription ---- Interroga la descrizione per un servizio.
        qfailure -------- Interroga le azioni intraprese da un servizio in caso di errore.
        elimina ---------- Elimina un servizio (dal registro).
        create ---------- 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 il ServiceKeyName per un servizio.
        EnumDepend ------ Enumera le dipendenze del servizio.

      I seguenti comandi non richiedono un nome di servizio:
      sc <server> <comando> <opzione>
        boot ------------ (ok | bad) Indica se l'ultimo avvio dovrebbe
                        essere salvato come ultima configurazione di avvio valida
        Blocca ------------ Blocca il database dei servizi
        QueryLock ------- Interroga LockStatus per il database SCManager
  ESEMPIO:
          sc avvia MyService

1
Sono d'accordo che questo è meglio di net start / stop. Si noti che esiste un'opzione per toccare i servizi anche su macchine remote.
Programmatore fuorilegge il

1
Bella risposta. Ma devi essere amministratore per eseguire "SC start service". Ho trovato una soluzione per questo qui (la risposta accettata contiene la soluzione)
Michael K.

56
Il problema con SC è che il comando ritorna immediatamente e non dopo che l'azione è stata completata. Se si desidera riavviare un servizio tramite file batch (arresto quindi avvio), l'arresto ritorna immediatamente, quindi l'avvio ha esito negativo poiché il servizio non è stato arrestato. L'arresto / avvio netto ritorna al termine dell'azione, quindi non si verifica questo problema.
Dom

Ho aperto il cmd come modalità amministratore, ottenendo un errore La sintassi di questo comando è: NET STOP service
Satish Singh

c'è un modo per verificare se il servizio è stato arrestato correttamente ?? nel 2020?
Anand Varkey Philips,

212
net start [serviceName]

e

net stop [serviceName]

dirti se sono riusciti o falliti abbastanza chiaramente. Per 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. Qualcosa di più alto 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 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


1
NET non è solo per le funzioni relative al servizio mentre SC è solo per le funzioni relative al servizio.
Wernight,

3
Questa risposta è migliore perché i comandi "net" bloccano e attendono l'avvio o l'arresto del servizio prima che l'esecuzione dello script batch continui.
Steven

Poiché (come dice la modifica) il più delle volte il errorlevelreso è 2, vedi qui come interpretare il risultato dell'errore .
HeyJude,

28

È 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: ho scritto questo dalla cima della mia testa, ma penso che funzionerà.


8

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  

7

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

1
In genere, le risposte solo al codice non sono apprezzate. Potresti approfondire la tua soluzione o aggiungere alcuni commenti esplicativi?
un earwig il

2
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.
Nathanial Wilson,


5

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

Ecco esplicitamente come aggiungere una linea 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 si trovano nello 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! ovvero "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

1
Come si fa se è necessario utilizzare un altro ID utente e password per accedere?
Frantumn,

1
Corri CMDcome l'altro utente / ID facendo runas /user:Domain\UserName cmdquindi inserisci la tua password. CMD inizierà l'esecuzione come account utente specificato.
user4317867

4

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 attorno al loop.

Ma poi di nuovo ...

Vedo che il primo servizio impiega molto tempo a terminare, quindi lo "stop netto" 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 interrompe in 3 o 4 secondi.


3

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


3

Ho appena usato l'esempio di Jonas sopra e ho creato un elenco completo di 0-24 livelli di errore. L'altro post è corretto net starte net stopusa solo errorlevel0 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%

Passa stopa starte funziona al contrario.


3

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

Questo può 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


2

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 l'avvio automatico Ripristino del sistema

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

  • Creare un punto di ripristino del sistema

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

  • Modifica utilizzo del disco di Ripristino configurazione di sistema

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

Godere


1

SC può fare tutto con i servizi ... avviare, arrestare, controllare, configurare e altro ...


1

A volte è possibile trovare la fermata non funziona ..

Il mio SQlServer a volte 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

0

Sto scrivendo un servizio Windows in C #, il ciclo stop / uninstall / build / install / start è diventato troppo stancante. Ha scritto un mini script, lo ha chiamato reploy.bate 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 sul 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 msbuildcomando per sviluppatori di Visual Studio affinché il comando 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 :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.