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)?
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)?
Risposte:
Usa il SC
comando (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
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
NET
non è solo per le funzioni relative al servizio mentre SC
è solo per le funzioni relative al servizio.
errorlevel
reso è 2, vedi qui come interpretare il risultato dell'errore .
È 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à.
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
Usando i codici di ritorno da net start
e mi net stop
sembra il metodo migliore. Prova questo: Codici di ritorno di Net Start .
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
CMD
come l'altro utente / ID facendo runas /user:Domain\UserName cmd
quindi inserisci la tua password. CMD inizierà l'esecuzione come account utente specificato.
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.
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 start
e net stop
usa 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%
Passa stop
a start
e funziona al contrario.
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
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
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
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.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 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 msbuild
comando 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 :)