[windows] Arresta e avvia un servizio tramite file batch o cmd?



5 Answers

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

Question

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




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  



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



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




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.




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.






Related