2009-04-29 28 views
21

Necesito saber el estado de un servicio al final de mi secuencia de comandos por lotes, que reinicia los servicios usando "net stop thingie" y "net start thingie".Comando de Windows para obtener el estado del servicio?

En mi mundo ideal favorito, me gustaría enviarme un e-mail a mí mismo, leer en las frías noches de invierno, para tranquilizarme con la calidez y la comodidad de un servidor que sé que funciona correctamente.

Solo para que lo sepas, estoy usando una plataforma Windows Server 2003, y un archivo por lotes me pareció la mejor opción. No me importa usar otra cosa, y estaría muy abierto a sugerencias, pero solo por el bien del conocimiento (como un zombi ansía cerebros, pensé, ¿por qué no inflar el mío?), ¿Hay algún comando que me permita verificarlo? en el estado de un servicio, en línea de comandos?

¿Debo simplemente redirigir la salida del comando a un archivo?

¿Dónde demonios están mis pantalones? (Dios, realmente espero que el humor insertado en esto no insulte a nadie. Es miércoles por la mañana, y el humor también lo necesito: P)

[Editar:] La solución que utilicé está (ya no) disponible para descargar de --link redactado--

Se utiliza como un conjunto de tareas para ser ejecutado durante la noche, y revisando mi correo electrónico por la mañana, veo si el servicio se ha reiniciado correctamente o no.

Respuesta

5

Usando 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 

puede filtrar fácilmente lo anterior para el servicio específico que desea.

+2

Seleccionado porque no requiere instalación. ¡Gracias chicos! –

12

Usando pstools - en particular psservice y "consulta" - por ejemplo:

psservice query "serviceName" 
+0

Este es mi favorito ^^ –

0

de acuerdo con este http://www.computerhope.com/nethlp.htm debe ser NET START/LIST pero no puedo hacer que funcione en el cuadro de XP. Estoy seguro de que hay un WMI que te dará la lista.

26

¿Has probado 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 

Tenga en cuenta que dentro de un archivo por lotes duplicaría cada signo de porcentaje.

19

Puede llamar al net start "service name" en su servicio. Si no se inicia, lo iniciará y devolverá errorlevel = 0; si ya está iniciado, devolverá errorlevel = 2.

+0

No estoy seguro de por qué obtuve un voto negativo sobre esto, pero como usa un archivo bat para iniciar el servicio con el comando net start, y está integrado en el comando para devolver un código de error, lo más fácil es simplemente verificar el código de error. Pero si es obligatorio crear un vbs por separado en lugar de verificar la devolución, no me importa. – JRL

1

Bueno, no estoy seguro de si puede enviar los resultados por correo electrónico desde un archivo por lotes. Si puedo hacer una sugerencia alternativa que resolvería su problema vbscript. Estoy lejos de ser excelente con vbscript, pero puede usarlo para consultar los servicios que se ejecutan en la máquina local. El siguiente script le enviará un correo electrónico con el estado de todos los servicios que se ejecutan en la máquina en la que se ejecuta el script. Obviamente, querrá reemplazar el servidor smtp y la dirección de correo electrónico. Si usted es parte de un dominio y ejecuta este script como un usuario con privilegios (tienen que ser un administrador en el equipo remoto) también puede consultar máquinas remotas al reemplazar el host local por el 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 = "[email protected]" 
objMessage.To = "[email protected]" 
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 

Espero que te ayude! ¡Disfrutar!

Editar: Ahh una cosa más, un estado de servicio de 4 significa que el servicio se está ejecutando, un estado de servicio de 1 significa que no lo es. No estoy seguro de qué significa 2 o 3, pero estoy dispuesto a apostar que se están deteniendo/iniciando.

+0

¡Muchas gracias por ese guión! Lo usaré anexado en mi archivo de proceso por lotes, en la forma simple pero eficiente de una llamada de shell a un script vb, que el servidor puede manejar fácilmente: P –

+0

Eso combinado con el otro script que he seleccionado como una buena respuesta , Obtuve mi ciclo de finalización de parada/reinicio/correo justo a punto. –

9

Si PowerShell está disponible para usted ...

Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name} 

le dará ...

Stopped : napagent 
Stopped : NetDDE 
Stopped : NetDDEdsdm 
Running : Netman 
Running : Nla 
Stopped : WMPNetworkSvc 
Stopped : xmlprov 

Puede reemplazar el **** **** red con un servicio específico nombre si solo necesita verificar un servicio.

10

mira también hier:

NET START | FIND "nombre de servicio"> nul SI errorlevel 1 ECHO El servicio no se está ejecutando

simplemente copiada de: http://ss64.com/nt/sc.html

+0

+ para "NET START", forma obvia de obtener una lista de servicios en ejecución – Fr0sT

2

Tal vez esto podría ser la mejor manera de iniciar un servicio y comprobar el resultado

Por supuesto, desde el interior de un lote como FILE.BAT poner algo como este ejemplo, pero basta con sustituir "NameOfSercive" con el nombre del servicio que desee y reemplazar las líneas de REM con su propio código:

@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 

Otra cosa es para comprobar su estado sin cambiarlo, por que hay una manera mucho más sencilla de hacerlo, basta con ejecutar:

net start 

Como que, sin parámetros se mostrará una lista con todos los servicios que se inician ...

grep Así que un simple o encontrar después de que en una tubería encajaría ...

por supuesto, desde el interior de un lote como FILE.BAT poner algo como este ejemplo, pero basta con sustituir "NameOfSercive" con el nombre del servicio que desea y reemplace las líneas REM con su propio código:

@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 

Espero que esto ayude !! Es lo que normalmente uso.

+0

Todo esto con el archivo temporal podría reemplazarse con '(NET START | FIND" NameOfService "> nul) && SET ServiceRunning = 1' o' GOTO 'en lugar de establecer la bandera. – Fr0sT

2

Bueno VEO "Nick Kavadias" decir esto:

"de acuerdo con esta http://www.computerhope.com/nethlp.htm debe ser NET START/LISTA ..."

Si escribe en Windows XP esto:

NET START /LIST 

obtendrá un error, sólo tiene que escribir en lugar

NET START 

La/LIST es solo para Windows 2000 ... Si lee completamente dicha web, verá que/LIST está solo en la sección de Windows 2000.

Espero que esto ayude!

0

Ros i el código artículo también está para saber cuántos servicios se están ejecutando ...

Imagínese que usted quiere saber cuántos servicios es como Oracle * y luego se pone en lugar de Oracle NameOfSercive ... y se obtiene el número de servicios, como Oracle * que se ejecuta en la variable% Countlines% y si quieres hacer algo si sólo hay 4 se puede hacer algo como esto:

SI 4 ==% Countlines% GOTO FourServicesAreRunning

Eso es mucho más poderoso ... y su código no le permite saber si el servicio deseado se está ejecutando ... si no hay un su srecive comenzando con el mismo nombre ... imaginar: -ServiceOne -ServiceOnePersonal

Si busca ServiceONE, pero sólo está ejecutando su código ServiceOnePersonal le dirá ServiceONE se está ejecutando ...

Mi código puede easly ser cambiado, ya que lee todas las líneas del archivo y leer línea por línea también puede hacer lo que quiera a cada servicio ... ver esto:

@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 

por supuesto que sólo la lista de servicios en ejecución, hago no se sabe de ninguna manera la red puede enumerar servicios que no se ejecutan ...

Espero que esto ayude!

2

mi intención era crear un script que cambia los servicios de ON y OFF (en 1 guión)

net start NameOfSercive 2>nul 
if errorlevel 2 goto AlreadyRunning 
if errorlevel 1 goto Error 

...

ayudado mucho !! TYVM z666

pero cuando, por ejemplo, el servicio está inhabilitado (también errorlevel = 2?) que va a "AlreadyRuning" y nunca llega a

if errorlevel 1 goto Error ?!! 

que quería una salida para ese caso ...

mis 2 Centavos, espero que esto ayude

Cuestiones relacionadas