risposta-alla-domanda-sullo-sviluppo-web-bd.com

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

264
Keng

Utilizzare il comando SC (controllo di servizio), offre molte più opzioni rispetto a start e 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" 
 Ulteriori informazioni sui comandi possono essere ottenute digitando: "sc [comando]" 
 Comandi: 
 query ----------- Esegue una query sullo 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 ---------- Cambia la configurazione di un servizio (persistente) .
 descrizione ----- Cambia la descrizione di un servizio .
 fallimento --------- Modifica le azioni eseguite 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 ad un servizio .
 sdshow ---------- Visualizza il descrittore di sicurezza di un servizio .
 sdset ----------- Imposta il descrittore di sicurezza di un servizio .
 GetDisplayName - Ottiene il 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 <server> <comando> <opzione> 
 boot ------------ (ok | bad) Indica se l'ultimo avvio dovrebbe 
 essere salvato come ultima configurazione di boot valida 
 Lock ------------ Blocca il database dei servizi 
 QueryLock ------- Query di LockStatus per il database di SCManager 
 ESEMPIO:
 sc avvia MyService 
326
Ferruccio
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ù in 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 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 restituiti

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

193
Bill Michell

È possibile 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 testa, ma penso che funzionerà.

27
Jonas Gulle

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

Ho creato il mio file batch personale per questo, il mio è un po 'diverso ma mi sento libero di modificare come tu ritieni opportuno L'ho creato poco fa perché ero annoiato e volevo creare un modo semplice per le persone in grado di inserire la fine, l'avvio, l'arresto o l'impostazione su auto. 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 /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
Nathanial Wilson

Usare i codici di ritorno da net start e net stop sembra il metodo migliore per me. Prova a dare un'occhiata a questo: Net Return codici di ritorno .

6
ZombieSheep

La sintassi 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! Ad esempio "4" uguale a "Pianificato" e commento "Arresto del server per manutenzione"

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

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 il "net stop" 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.

4
DaveH

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

3
onionpsy

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 ping (esegue ping ogni 1 secondo): Sc stop Ping localhost -n 60sc start 

2
Kuleris

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 usino solo errorlevel 0 per il successo e 2 per il 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 in start e funziona al contrario.

2
Clinton

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

1
Axeman

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
1
andrew pate

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

sc config swprv start= Auto

Potrebbero piacerti anche quei comandi:

  • Cambia il valore del registro per avviare automaticamente 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 ha salvato il tuo PC", 100, 12

  • Cambia l'utilizzo del disco Ripristino configurazione di sistema

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

Godere

1
djibe

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

Basta impostare questi 3 vars 

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

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

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

NOTA: questo deve essere eseguito dalla riga di comando di Visual Studio Developer 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 :)

0
sh87