Comando di Windows per ottenere lo stato del servizio?
-
03-07-2019 - |
Domanda
Devo conoscere lo stato di un servizio alla fine del mio script batch che riavvia i servizi usando "net stop thingie" e " net start thingie " ;.
Nel mio mondo ideale preferito, vorrei mandare per e-mail lo stato a me stesso, leggere nelle fredde notti invernali, rassicurarmi con il calore e il comfort di un server che so funzionare correttamente.
Solo per farvi sapere, sto usando una piattaforma Windows Server 2003 e un file batch sembrava la scelta migliore. Non mi dispiace usare qualcos'altro, e sarebbe molto aperto ai suggerimenti, ma solo per il gusto della conoscenza (poiché uno zombi brama il cervello, ho pensato, perché non gonfiare il mio), c'è un comando che mi permette di controllare sullo stato di un servizio, nella riga di comando?
Devo semplicemente reindirizzare l'output del comando su un file?
Dove diavolo sono i miei pantaloni? (Accidenti, spero davvero che l'umorismo inserito in questo non insulti nessuno. È mercoledì mattina e anche l'umorismo mi serve: P)
[Modifica:] La soluzione che ho usato è (non più) disponibile per il download da --link redatto--
Viene utilizzato come set di attività da eseguire durante la notte e, controllando la mia e-mail al mattino, vedo se il servizio è stato riavviato correttamente.
Soluzione
Utilizzando Windows Script:
Set ComputerObj = GetObject("WinNT://MYCOMPUTER")
ComputerObj.Filter = Array("Service")
For Each Service in ComputerObj
WScript.Echo "Service display name = " & Service.DisplayName
WScript.Echo "Service account name = " & Service.ServiceAccountName
WScript.Echo "Service executable = " & Service.Path
WScript.Echo "Current status = " & Service.Status
Next
Puoi facilmente filtrare quanto sopra per il servizio specifico che desideri.
Altri suggerimenti
Hai provato sc.exe
?
C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4 RUNNING
C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1 STOPPED
Nota che all'interno di un file batch raddoppieresti ogni segno di percentuale.
Puoi chiamare net start " nome servizio "
sul tuo servizio. Se non è avviato, lo avvierà e restituirà errorlevel = 0, se è già avviato restituirà errorlevel = 2.
guarda anche hier:
NET START | TROVA " Nome servizio " & Gt; nul IF errorlevel 1 ECHO Il servizio non è in esecuzione
appena copiato da: http://ss64.com/nt/sc.html
Se PowerShell è disponibile per te ...
Get-Service -DisplayName *Network* | ForEach-Object{Write-Host Se PowerShell è disponibile per te ...
Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov
Ti darà ...
<*>
Puoi sostituire **** **** **** con un nome di servizio specifico se devi solo controllare un servizio.
.Status : Se PowerShell è disponibile per te ...
<*>
Ti darà ...
<*>
Puoi sostituire **** **** **** con un nome di servizio specifico se devi solo controllare un servizio.
.Name}
Ti darà ...
<*>Puoi sostituire **** **** **** con un nome di servizio specifico se devi solo controllare un servizio.
Forse questo potrebbe essere il modo migliore per avviare un servizio e controllare il risultato
Ovviamente dall'interno di un batch come File.BAT inserisci qualcosa di simile a questo esempio, ma sostituisci semplicemente " NameOfSercive " con il nome del servizio desiderato e sostituire le righe REM con il proprio codice:
@ECHO OFF
REM Put whatever your Batch may do before trying to start the service
net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error
REM Put Whatever you want in case Service was not running and start correctly
GOTO ContinueWithBatch
:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch
:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch
:ContinueWithBatch
REM Put whatever else your Batch may do
Un'altra cosa è controllare il suo stato senza cambiarlo, per questo c'è un modo molto più semplice per farlo, basta eseguire:
net start
In questo modo, senza parametri mostrerà un elenco con tutti i servizi che vengono avviati ...
Quindi un semplice grep o find dopo esso su una pipe si adatterebbe ...
Ovviamente dall'interno di un batch come File.BAT inserisci qualcosa di simile a questo esempio, ma sostituisci semplicemente " NameOfSercive " con il nome del servizio desiderato e sostituire le righe REM con il proprio codice:
@ECHO OFF
REM Put here any code to be run before check for Service
SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning
REM Put here any code to be run if Service Is Running
GOTO ContinueWithBatch
:ServiceIsNotRunning
REM Put here any code to be run if Service Is Not Running
GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=
REM Put here any code to be run after check for Service
Spero che questo possa aiutare !! È quello che uso normalmente.
Bene, vedo " Nick Kavadias " dicendo questo:
" secondo questo http://www.computerhope.com/nethlp.htm dovrebbe essere NET START / LIST ... "
Se si digita in Windows XP questo:
NET START /LIST
otterrai un errore, basta digitare invece
NET START
LISTA / ELENCO è solo per Windows 2000 ... Se leggi completamente tale Web, vedrai / ELENCO solo nella sezione Windows 2000.
Spero che questo aiuti !!!
la mia intenzione era quella di creare uno script che attiva e disattiva i servizi (in 1 script)
net start NameOfSercive 2>nul if errorlevel 2 goto AlreadyRunning if errorlevel 1 goto Error
...
Aiutato molto !! TYVM z666
ma quando ad es. il servizio è disabilitato (anche errorlevel = 2?) va su " AlreadyRuning " e non arriva mai
if errorlevel 1 goto Error ?!!
volevo un output per quel caso ...
:AlreadyRunning net stop NameOfSercive if errorlevel 1 goto Error :Error Echo ERROR!!1! Pause
i miei 2 centesimi, spero che questo aiuti
Beh, non sono sicuro che tu possa inviare i risultati via e-mail da un file batch. Se potessi fare un suggerimento alternativo per risolvere il tuo problema vbscript. Sono tutt'altro che bravo con vbscript ma puoi usarlo per interrogare i servizi in esecuzione sul computer locale. Lo script seguente ti invierà per email lo stato di tutti i servizi in esecuzione sul computer su cui viene eseguito lo script. Ovviamente vorrai sostituire il server smtp e l'indirizzo e-mail. Se fai parte di un dominio ed esegui questo script come utente privilegiato (devono essere amministratori sulla macchina remota) puoi anche interrogare macchine remote sostituendo localhost con fqdn.
Dim objComputer, objMessage
Dim strEmail
' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next
' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "service_report@noreply.net"
objMessage.To = "youraddress@example.net"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"
'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")
For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next
objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send
Spero che questo ti aiuti! Buon divertimento!
Modifica: Ahh un'altra cosa uno stato del servizio di 4 indica che il servizio è in esecuzione, uno stato del servizio di 1 significa che non lo è. Non sono sicuro del significato di 2 o 3, ma sono disposto a scommettere che si stanno arrestando / avviando.
secondo questo http://www.computerhope.com/nethlp.htm esso dovrebbe essere NET START / LIST ma non riesco a farlo funzionare su XP box. Sono sicuro che c'è un WMI che ti fornirà l'elenco.
Ros il codice che invio è anche per sapere quanti servizi sono in esecuzione ...
Immagina di voler sapere quanti servizi sono come Oracle *, quindi metti Oracle invece di NameOfSercive ... e ottieni il numero di servizi come Oracle * in esecuzione sulla variabile% CountLines% e se vuoi fare qualcosa se ce ne sono solo 4 che puoi fare in questo modo:
IF 4 ==% CountLines% GOTO FourServicesAreRunning
Questo è molto più potente ... e il tuo codice non ti consente di sapere se il servizio desiderato è in esecuzione ... se c'è un altro srecive che inizia con lo stesso nome ... immagina: -ServiceOne -ServiceOnePersonal
Se cerchi ServiceOne, ma è in esecuzione solo ServiceOnePersonal, il tuo codice indicherà che ServiceOne è in esecuzione ...
Il mio codice può essere facilmente modificato, dal momento che legge tutte le righe del file e legge riga per riga può anche fare tutto ciò che vuoi per ogni servizio ... vedi questo:
@ECHO OFF
REM Put here any code to be run before check for Services
SET TemporalFile=TemporalFile.TXT
NET START > %TemporalFile%
SET CountLines=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
SETLOCAL EnableDelayedExpansion
SET CountLine=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO @(
SET /A CountLine=1+CountLine
REM Do whatever you want to each line here, remember first and last are special not service names
IF 1==!CountLine! (
REM Do whatever you want with special first line, not a service.
) ELSE IF %CountLines%==!CountLine! (
REM Do whatever you want with special last line, not a service.
) ELSE (
REM Do whatever you want with rest lines, for each service.
REM For example echo its position number and name:
echo !CountLine! - %%X
REM Or filter by exact name (do not forget to not remove the three spaces at begining):
IF " NameOfService"=="%%X" (
REM Do whatever you want with Service filtered.
)
)
REM Do whatever more you want to all lines here, remember two first are special as last one
)
DEL -P %TemporalFile% 2>nul
SET TemporalFile=
REM Put here any code to be run after check for Services
Ovviamente elenca solo i servizi in esecuzione, non so in alcun modo che la rete può elencare i servizi in esecuzione ...
Spero che questo aiuti !!!