windows - visual - Cómo probar si un servicio se está ejecutando desde la línea de comando
watcher path c# (14)
He encontrado esto:
sc query "ServiceName" | findstr RUNNING
parece hacer más o menos lo correcto. Pero me preocupa que no sea lo suficientemente generalizado para funcionar en sistemas operativos que no sean ingleses.
Me gustaría poder consultar si un servicio se está ejecutando o no desde un archivo de lote de Windows. Sé que puedo usar:
consulta sc "ServiceName"
pero, esto arroja algo de texto. Lo que realmente quiero es que establezca la variable de entorno errorlevel
para que pueda tomar medidas al respecto.
¿Sabes de una manera simple que puedo hacer esto?
ACTUALIZAR
Gracias por las respuestas hasta ahora. Me preocupa que las soluciones que analizan el texto no funcionen en sistemas operativos que no sean en inglés. ¿Alguien sabe una forma de evitar esto, o voy a tener que morder la bala y escribir un programa de consola para hacerlo bien?
Noté que nadie mencionó el uso de expresiones regulares al usar las respuestas basadas en find
/ findstr
. Eso puede ser problemático para servicios con nombres similares.
CDPUserSvc
que tiene dos servicios, CDPUserSvc
y CDPUserSvc_54530
Si usa la mayoría de las respuestas basadas en find
/ findstr
aquí hasta el momento, obtendrá falsos positivos para CDPUserSvc
consultas de CDPUserSvc
cuando solo se esté ejecutando CDPUserSvc_54530
.
Los modificadores /r
y /c
para findstr
pueden ayudarnos a manejar ese caso de uso, así como también el carácter especial que indica el final de la línea, $
Esta consulta solo verificará la ejecución del servicio CDPUserSvc
e ignorará CDPUserSvc_54530
sc query|findstr /r /c:"CDPUserSvc$"
Pensando un poco fuera de la caja aquí voy a proponer que PowerShell puede ser una respuesta en máquinas actualizadas XP / 2003 y ciertamente en Vista / 2008 y más reciente (en lugar de .bat / .cmd). Cualquiera que tenga algo de Perl en su entorno debería sentirse en casa con bastante rapidez.
$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;
if ($serviceStatus -eq "Running") {
echo "Service is Running";
}
else {
#Could be Stopped, Stopping, Paused, or even Starting...
echo "Service is $serviceStatus";
}
Otra forma, si tiene una inversión significativa en lotes, es ejecutar el script PS como una línea, devolviendo un código de salida.
@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq ''Running''){exit 1}}"
ECHO.%ERRORLEVEL%
Al correr como una línea, también se evita la política de firma del código de la PS a expensas del desorden. Para poner los comandos PS en un archivo .ps1 y ejecutar como powershell myCode.ps1
, puede encontrar que la firma de sus scripts de powershell es necesaria para ejecutarlos de manera automática (depende de su entorno). Ver http://www.hanselman.com/blog/SigningPowerShellScripts.aspx para detalles
Podría usar wmic con la opción /locale
call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
echo Running
) else (
echo Not running
)
Solo para agregar a la lista si está usando Powershell.
sc.exe query "ServiceName" | findstr RUNNING
El siguiente comando no funciona porque sc
es un alias de Set-Content dentro de Powershell.
sc query "ServiceName" | findstr RUNNING
find
también no funciona en Powershell por alguna razón desconocida para mí.
sc.exe query "ServiceName" | find RUNNING
Sugeriría WMIC Service WHERE "Name = ''SericeName''" GET Started
o WMIC Service WHERE "Name = ''ServiceName''" GET ProcessId
(ProcessId será cero si el servicio no se inicia)
Puede establecer el nivel de error según si el primero arroja "VERDADERO" o el último devuelve un valor distinto de cero
Tratar
sc query state= all
para obtener una lista de servicios y si se están ejecutando o no.
Usa Cygwin Bash con:
sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"
(Asegúrese de tener sc.exe
en su RUTA).
Volvamos a la vieja escuela de programación por lotes en Windows
net start | find "Service Name"
Esto funcionará en todas partes ...
si no te importa combinar el comando net con grep, puedes usar el siguiente script.
@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end
@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro
goto end
:end
SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end
:end
sc query "ServiceName" | find "RUNNING"
sc query "servicename" | findstr STATE
por ejemplo:
sc query "wuauserv" | findstr STATE
Para informar qué está haciendo el servicio de actualización de Windows, en ejecución / en pausa, etc.
Esto también es para Windows 10. Gracias más tarde.