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.

È stato utile?

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.

Uso di pstools - in particolare psservice e " query " - ad esempio:

psservice query "serviceName"

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top