¿Cómo mantener los Servicios de Windows siempre activos?

febrero 3, 2010
By

Por diferentes razones un Servicio de Windows (los nativos de Microsoft o aquellos que crean las aplicaciones de terceros) se “cae” y deja de funcionar. Windows trae un sistema simple de recuperación que permite configurar qué hacer cuando esto sucede, pero como algunos habrán notado, solo funciona si el servicio falla drásticamente (crash). En otros escenarios como por ejemplo cuando el servicio nunca llega a iniciar, por falta de recursos o timeout, pues el sistema de recuperación no funciona.

Existen varios programas en Internet (comerciales la mayoría $$$) que resuelven esto. Sin embargo, con .NET y un conocimiento mínimo de programación, podemos hacernos nuestro propio programa :) . En este artículo, adjunto el código fuente de mi propuesta.

El “WindowsService.WatchDog” que es como he titulado a este código de ejemplo que  pongo a disposición de ustedes, está compuesto por una aplicación de consola (WindowsService.WatchDog.exe) que es el encargado de levantar los servicios caídos y una aplicación de Windows Forms (WindowsService.WatchDog.Configuration.exe) que es la interfaz visual de selección de los servicios que se desean verificar y activar en caso de estar caídos.

La idea consiste en ejecutar la aplicación de consola WindowsService.WatchDog.exe periódicamente utilizando el Planificador de Tareas de Windows, digamos cada cinco minutos. Entonces esta aplicación verificará si existe algún servicio de los previamente seleccionados (a través de la aplicación de configuración) y en caso afirmativo pues intentará iniciarlo.

El código (Listado 1) en C# es muy simple. Gracias a .NET (ensamblado System.ServiceProcess) solo tenemos que iterar por el listado de servicios del sistema y comparar el nombre del servicio con los previamente seleccionados (en este caso un diccionario llamado selectedServices).

var services = System.ServiceProcess.ServiceController.GetServices();
foreach (var service in services)
{
    if (selectedServices.ContainsKey(service.ServiceName))
    {
        if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running)
        {
            try
            {
                service.Start();
            }
            catch (Exception err)
            {
                // SE MANEJA LA EXCEPCIÓN
            }
        }
    }
}

Listado 1. Fragmento de código en C# de la aplicación de consola WindowsService.WatchDog.exe

Como puede notar en el Listado 1,  se puede manejar la excepción en caso de ocurrir algún problema al intentar iniciar el servicio. Por ejemplo, pudiésemos utilizar el espacio de nombres System.Net.Mail y desarrollar en pocas líneas un código que nos envíe un correo en caso de fallo.

Pues esto es todo lo que necesitamos para hacer un “Watch Dog” de Servicios en .NET ¿Fácil verdad?

Descargar Aplicación: WindowsService.WatchDog.zip

Tags: , , ,

3 Responses to ¿Cómo mantener los Servicios de Windows siempre activos?

  1. market on septiembre 8, 2010 at 9:48 pm

    Buena salida ;)

  2. Camilo Soto on abril 30, 2015 at 10:26 am

    Gracias por el aporte, solo una pregunta, como hago para que se ejecute cada cierto tiempo

    • Adan Vallverdu on junio 2, 2016 at 3:41 pm

      Dependiendo donde lo queres configurar. Si es en un dominio podes hacer un script que lo llame cada vez que inicien sesion, si es para uso particular podes ver de colocarlo en el starup de windows que cuando inicie llame a ese .exe

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Acerca del autor...

Alejandro Tamayo

Web: http://www.linkedin.com/in/atamayocastillo
Alejandro Tamayo
Professor, Researcher, Developer, Consultant and technology enthusiast. Master of Science (MSc) in Computer Science and member of Weboo Research Group.Leer completo