Tengo una aplicación en C# (2.0 ejecutándose en XP incrustado) que se está comunicando con un 'watchdog' implementado como un servicio de Windows. Cuando se inicia el dispositivo, este servicio normalmente tarda un poco en comenzar. Me gustaría verificar, desde mi código, si el servicio se está ejecutando. ¿Cómo puedo lograr esto?¿Cómo puedo verificar si se está ejecutando un servicio de Windows?
Respuesta
supongo que algo como esto funcionaría:
Añadir System.ServiceProcess a las referencias del proyecto (está en la ficha .NET).
La forma más rápida:
return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running;
La manera más segura:
try
{
using(ServiceController sc = new ServiceController(SERVICE_NAME))
{
return sc.Status == ServiceControllerStatus.Running;
}
}
catch(ArgumentException) { return false; }
catch(Win32Exception) { return false; }
La manera más detallada:
using System.ServiceProcess;
//
ServiceController sc;
try
{
sc = new ServiceController(SERVICE_NAME);
}
catch(ArgumentException)
{
return "Invalid service name."; // Note that just because a name is valid does not mean the service exists.
}
using(sc)
{
ServiceControllerStatus status;
try
{
sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically.
status = sc.Status;
}
catch(Win32Exception ex)
{
// A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status.
// See Win32 QueryServiceStatus()'s documentation.
return "Error: " + ex.Message;
}
switch(status)
{
case ServiceControllerStatus.Running:
return "Running";
case ServiceControllerStatus.Stopped:
return "Stopped";
case ServiceControllerStatus.Paused:
return "Paused";
case ServiceControllerStatus.StopPending:
return "Stopping";
case ServiceControllerStatus.StartPending:
return "Starting";
default:
return "Status Changing";
}
}
Editar: También hay un método sc.WaitforStatus()
que toma un estado deseado y un tiempo de espera, nunca lo usó, pero puede adaptarse a sus necesidades.
Editar: Una vez que obtenga el estado, para obtener el estado nuevamente, primero deberá llamar al sc.Refresh()
.
Referencia: ServiceController objeto en .NET.
Eche un vistazo al objeto ServiceController en .NET.
Oooh ... incluso mejor que rodando el suyo a través de WMI. Eliminaré mi respuesta. – EBGreen
@EBGreen - No sé, la ruta de WMI puede ser útil para otra persona en el futuro, hay más de una manera de despellejar a un gato, y todo eso .... – Carl
Ya, pero realmente creo que ServiceController es mejor sobre todo, así que creo que lo dejaré eliminado. Nunca hubiera sugerido WMI si no hubiera despertado. :) – EBGreen
Aquí obtiene todos los servicios disponibles y su estado en su máquina local.
ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
Console.WriteLine(service.ServiceName+"=="+ service.Status);
}
Puede comparar su servicio con la propiedad service.name dentro del bucle y obtendrá el estado de su servicio. Para los detalles vaya con http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx también http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx
- 1. ¿Verifica si se está ejecutando un servicio de Windows?
- 2. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 3. ¿Cómo puedo verificar si estoy ejecutando Windows en Python?
- 4. Comprobando si mi aplicación de Windows se está ejecutando
- 5. ¿Cómo verificar si el servidor X se está ejecutando?
- 6. ¿Cómo puedo verificar desde Ruby si se está ejecutando un proceso con un determinado pid?
- 7. Cómo verificar si un servicio de Windows está instalado en C#
- 8. ¿Cómo puedo verificar si un programa se está ejecutando por primera vez?
- 9. ¿Cómo puedo saber si un proceso se está ejecutando?
- 10. ¿Cómo determinar si un servicio de Android se está ejecutando en primer plano?
- 11. ¿Cómo puedo verificar si actualmente se está visualizando un UIViewController?
- 12. Cómo verificar un script bash si algo se está ejecutando y salir si es
- 13. Determinar si el programa se está ejecutando en Windows Server
- 14. ¿Está ejecutando un servicio de Windows en modo consola?
- 15. C++, ¿Cómo determinar si se está ejecutando un proceso de Windows?
- 16. ¿Cómo verificar si se está ejecutando un proceso con un PID determinado?
- 17. ¿Cómo verificar con inno-setup, si un proceso se está ejecutando en un windows 2008 r2 64bit?
- 18. ¿Cómo puedo probar si R se está ejecutando como Rscript?
- 19. ¿Cómo verificar si un SWF se está ejecutando como una aplicación de AIR?
- 20. Compruebe si un script php todavía se está ejecutando
- 21. ¿Está usando GetProcessesByName la mejor manera de verificar si un proceso se está ejecutando?
- 22. ¿Cómo puedo saber si mi script de Perl se está ejecutando en Windows?
- 23. ¿Cómo comprobar si un servicio se está ejecutando a través de un archivo por lotes e iniciarlo, si no se está ejecutando?
- 24. Comprobar si el proceso se está ejecutando
- 25. ¿Cómo puedo verificar si el teléfono Android se está cargando?
- 26. Comprueba si se está ejecutando un archivo exe específico
- 27. Dentro de un archivo por lotes, ¿cómo puedo saber si se está ejecutando un proceso?
- 28. ¿Cómo saber si se está ejecutando un temporizador?
- 29. Cómo comprobar si se está ejecutando un Thread de Android
- 30. ¿Cómo puedo verificar si un hotfix particular (actualización de Windows) está instalado en mi sistema?
ServiceController.GetServices() recupera una matriz que contiene todo el servicio instalado como objeto ServiceController. Esto puede ayudar mucho. – Larry
Buena llamada, no sé si alguna vez lo he usado. Incluso si nunca lo usa, supongo que sería útil para la depuración si nada más – Carl
sc.WaitforStatus() fuera exactamente lo que necesito. Thx – edosoft