windows services - ver - Comando de Windows para obtener el estado del servicio?
obtener service tag cmd (12)
Necesito saber el estado de un servicio al final de mi script por lotes que reinicia los servicios usando "net stop thingie" y "net start thingie".
En mi mundo ideal favorito, me gustaría enviarme un correo electrónico al estado, leer en las noches frías de invierno, para tranquilizarme con la calidez y la comodidad de un servidor que sé que funciona correctamente.
Para que lo sepa, estoy usando una plataforma Windows Server 2003, y un archivo por lotes parece ser la mejor opción. No me importa usar otra cosa, y sería muy abierto a sugerencias, pero solo por el bien del conocimiento (como un zombi anhela cerebros, pensé, ¿por qué no inflar el mío), hay un comando que me permite verificar? ¿En el estado de un servicio, en línea de comando?
¿Debo simplemente redirigir la salida del comando a un archivo?
¿Dónde diablos están mis pantalones? (Dios mío, realmente espero que el humor insertado en esto no insulte a nadie. Es miércoles por la mañana, y también necesito el humor: P)
[Editar:] La solución que utilicé (ya no) está disponible para descargar desde --link redacted -
Se utiliza como un conjunto de tareas que se ejecutará durante la noche, y al revisar mi correo electrónico por la mañana, veo si el servicio se ha reiniciado correctamente o no.
¿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.
Bueno, no estoy seguro de si puede enviar por correo electrónico los resultados de un archivo por lotes. Si puedo hacer una sugerencia alternativa que resolvería su problema vbscript. No estoy muy bien con vbscript, pero puede usarlo para consultar los servicios que se ejecutan en la máquina local. La siguiente secuencia de comandos le enviará por correo electrónico el estado de todos los servicios que se ejecutan en la máquina en la que se ejecuta la secuencia de comandos. Obviamente, querrá reemplazar el servidor smtp y la dirección de correo electrónico. Si es parte de un dominio y ejecuta este script como usuario privilegiado (tienen que ser administradores en la máquina remota), también puede consultar máquinas remotas al reemplazar 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 = "[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 esto te ayude! ¡Disfrutar!
Edición: 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 está. No estoy seguro de lo que significa 2 o 3, pero estoy dispuesto a apostar que están parando / arrancando.
Bueno, veo "Nick Kavadias" diciendo esto:
"según este http://www.computerhope.com/nethlp.htm debería ser NET START / LIST ..."
Si escribes en Windows XP esto:
NET START /LIST
obtendrá un error, simplemente escriba en su lugar
NET START
La / LIST es solo para Windows 2000 ... Si lees completamente esa web, verías que la / LIST está solo en la sección de Windows 2000.
¡¡¡Espero que esto ayude!!!
Puede llamar a net start "service name"
en su servicio. Si no está iniciado, lo iniciará y devolverá errorlevel = 0, si ya está iniciado, devolverá errorlevel = 2.
Quizás esta podría ser la mejor manera de comenzar un servicio y verificar el resultado.
Por supuesto, desde dentro de un Lote como File.BAT ponga algo como este ejemplo, pero simplemente reemplace "NameOfSercive" con el nombre de servicio que desee y reemplace las líneas 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 verificar su estado sin cambiarlo, para eso hay una manera mucho más simple de hacerlo, simplemente ejecute:
net start
Como tal, sin parámetros mostrará una lista con todos los servicios que se inician ...
Así que un simple grep o encontrarlo después en una tubería cabría ...
Por supuesto, desde dentro de un Lote como File.BAT ponga algo como este ejemplo, pero simplemente reemplace "NameOfSercive" con el nombre de servicio que desee 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 pueda ayudar !! Es lo que normalmente uso.
Ros el código que publico también es para saber cuántos servicios se están ejecutando ...
Imagina que quieres saber cuántos servicios son como Oracle *, luego pones Oracle en lugar de NameOfSercive ... y obtienes la cantidad de servicios como Oracle * que se ejecutan en la variable% CountLines% y si quieres hacer algo si solo hay 4 puedes hacer algo como esto:
IF 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 hay otro recurso que comienza con el mismo nombre ... imagine: -ServiceOne -ServiceOnePersonal
Si busca ServiceOne, pero solo está ejecutando ServiceOnePersonal, su código le indicará que ServiceOne se está ejecutando ...
Mi código se puede cambiar fácilmente, ya que lee todas las líneas del archivo y línea por línea también puede hacer lo que quiera con cada servicio ... vea 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, solo enumera los servicios en ejecución, no conozco ninguna forma en que net pueda enumerar los servicios en ejecución ...
¡¡¡Espero que esto ayude!!!
Si PowerShell está disponible para usted ...
Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}
Te regalaré...
Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov
Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.
Utilizando 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.
de acuerdo con este http://www.computerhope.com/nethlp.htm debería ser NET START / LIST pero no puedo hacer que funcione en el cuadro de XP. Estoy seguro de que hay algunos WMI que te darán la lista.
mi intención era crear un script que encienda y apague los servicios (en 1 script)
net start NameOfSercive 2>nul if errorlevel 2 goto AlreadyRunning if errorlevel 1 goto Error
...
Ayudó mucho !! TYVM z666
pero cuando, por ejemplo, el servicio está deshabilitado (¿también errorlevel = 2?) va a "AlreadyRuning" y nunca llega a
if errorlevel 1 goto Error ?!!
Quería una salida para ese caso ...
:AlreadyRunning net stop NameOfSercive if errorlevel 1 goto Error :Error Echo ERROR!!1! Pause
mis 2 centavos espero que esto ayude
mira también hier:
NET START | ENCUENTRE "Nombre del servicio"> nul SI errorlevel 1 ECHO El servicio no se está ejecutando
solo copiado de: http://ss64.com/nt/sc.html