Monitorizar los Servicios 1

Muchas de las operaciones que hace un equipo (especialmente un servidor) es ejecutar servicios. Esto hace que debamos ser cuidadosos con monitorizar los servicios que se ejecutan en los equipos de nuestra red. Una de las maneras más prácticas de monitorización es el uso de scripts.

Muchos de los servicios (DNS, DHCP,…) son críticos y un error en un único servidor puede tener un impacto en cientos, incluso miles, de usuarios, impidiéndoles iniciar sesión o acceder a los recursos de la red.

Como normas más generales de monitorización:

  • Monitorizar la disponibilidad del servicio: Medir el porcentaje de tiempo que un servicio está disponible.

La definición exacta de disponibilidad depende de lo que se espera de cada servicio. Si un recurso debe estar disponible todos los días de 22:00 a 06:00 horas y éste fallase un domingo a las 8:00 de la mañana, no se consideraría fallo de disponibilidad.

  • Monitorizar la fiabilidad del servicio: Medir la frecuencia de fallos de un servicio y el tiempo necesario para restaurarlo a su funcionalidad.

La fiabilidad se calcula mediante la división del tiempo que el servicio está en funcionamiento por el número total de días en un año. Por ejemplo,un servicio que ha sufrido paradas en 6 días durante un año tendría una fiabilidad de 98,3% ((359 días disponible)/365 días en un año)

  • Monitorizar el rendimiento del servicio: Medir si el servicio cumple su tarea en la forma esperada.
Monitorizar la disponibilidad del servicio

Cuando monitorizamos la disponibilidad de un servicio, comprobamos sólo que el servicio se esté ejecutando. Si necesitamos saber si el servicio se ejecuta con máxima eficiencia, necesitamos usar otro tipo de monitorización (el rendimiento). Aunque relativamente es simple, la monitorización de disponibilidad es muy importante; otras cuestiones, como si el servicio se comporta en el nivel esperado, no tienen sentido si no se está ejecutando.

Esta monitorización comprende normalmente una prueba que nos devolverá el estado del servicio. Guardando el resultado de cada prueba en una BD podemos calcular la disponibilidad de un servicio. Si realizamos 100 pruebas y el servicio responde 97 veces, someramente, está disponible un 97%.

La disponibilidad frecuentemente se expresa con la media de tiempo que durante un año el servicio no ha estado disponible.

Para incrementar la disponibilidad de un servicio podemos intentar:

  • Aumentar el tiempo medio entre fallos: Desafortunadamente, un fallo de servicio es causado frecuentemente por un error del propio servicio o del sistema operativo. A menos que seamos los autores del código, poco podremos cambiar para solucionar el error y así aumentar el tiempo entre fallos.
  • Disminuir el tiempo necesario para reiniciar el servicio: Si hemos de reiniciar el servicio manualmente cada vez que falle, el servicio no será funcional a menos que lo reiniciemos. Para aumentar la disponibilidad, podemos escribir un script que compruebe su estado y reinicie, en su caso, el servicio automáticamente, periódicamente.

Podemos usar scripts de Shell (sc.exe y net.exe), WSH, WMI (Scriptomatic utility) y ADSI (ADSI Scriptomatic).

Informar sobre la disponibilidad de los servicios puede hacerse mediante:

  • Informar sobre el estado del servicio.
  • Informar de los servicios que se encuentran en un estado específico (e.g. en ejecución o detenidos)

Informar del estado de todos los servicios.

   1: 'Este script sirve para comprobar el estado de todos los servicios
   2: 'en un archivo de texto
   3:  
   4: '(c) Juansa 28-11-2008
   5:  
   6: Const ForReading = 1, ForWriting = 2
   7: Dim TabStop, NewLine
   8: TabStop = Chr(9)
   9: NewLine = Chr(10)
  10: Set objFSO = CreateObject("Scripting.FileSystemObject")
  11: Set objFile = objFSO.OpenTextFile("C:scriptsEstado_Servicios.txt", ForWriting, True)
  12:  
  13: StrComputer = "."
  14: Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=Impersonate}!\" & strComputer & "rootcimv2")
  15: Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service")
  16: For each objService in colServices
  17: 'escribimos el nombre y el estado del servicio
  18: objFile.WriteLine Date & TabStop & objService.DisplayName 
  19: objFile.WriteLine objService.State
  20:  
  21: Next
  22:  
  23: Wscript.Echo  "FINALIZADO"
El resultado:

estadodelosservicios

* Podemos incluirlo en una tarea programada y realizar la comprobación diaria o a horas determinadas. Se puede incluir además de la fecha, la hora en la que se realiza la comprobación en el script.

  1. Creamos una constante de lectura y escritura
  2. creamos las variables de Tab y Nueva linea
  3. Asignamos los valores de Tab y NewLine
  4. Creamos el objeto del archivo
  5. Abrimos el archivo, indicando su ruta y nombre, para escritura.
  6. variable del equipo, el punto indica equipo local.
  7. conectamos con el espacio de nombres WMI rootcimv2 con GetObject, estableciendo el nivel de impersonation en impersonate.
  8. Usamos el método ExecQuery para conectar con la clase Win32_Service, lo que nos devolverá una colección que consiste en todos los servicios instalados en el equipo.
  9. Para cada servicio devuelto en la colección, se escribe una nueva línea para la fecha actual y el nombre del servicio y una nueva línea para su estado, en el archivo abierto.
  10. Lanzamos un mensaje al acabar. -Podemos eliminarlo si el script no requiere de nuestra presencia.

Informar sólo de aquéllos servicios que no están en ejecución

   1: 'Este script sirve para listar los servicios en estado detenido en un archivo de texto
   2:  
   3: '(c) Juansa 28-11-2008
   4:  
   5: Const ForReading = 1, ForWriting = 2
   6: Dim TabStop, NewLine
   7: TabStop = Chr(9)
   8: NewLine = Chr(10)
   9: Set objFSO = CreateObject("Scripting.FileSystemObject")
  10: Set objFile = objFSO.OpenTextFile("C:scriptsServicios_detenidos.txt", ForWriting, True)
  11:  
  12: StrComputer = "."
  13: Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=Impersonate}!\" & strComputer & "rootcimv2")
  14: Set colserviciosdetenidos = objWMIService.ExecQuery("SELECT DisplayName, State FROM Win32_Service WHERE State <> 'Running'")
  15: 'escribimos el título en el archivo
  16: objFile.WriteLine "LISTADO DE SERVICIOS QUE NO SE ESTÁN EJECUTANDO EN FECHA: " & Date
  17: objFile.WriteLine
  18: For each objService in colserviciosdetenidos
  19: 'escribimos el nombre y el estado del servicio
  20: objFile.WriteLine objService.DisplayName & ": " & objService.State
  21:  
  22: Next
  23:  
  24: Wscript.Echo  "FINALIZADO"

* El cambio es evidente, hemos modificado la consulta (SELECT) para que sólo devuelva los servicios que no tengan un estado Running.

estado_detenidos

Crear una tarea en Windows para que se ejecute el script diariamente

  1. Desde Inicio, todos los programas, accesorios, herramientas del sistema, programador de tareas.
    tarea01
  2. Desde la ventana del programador, doble clic en Agregar tarea programada y seguiremos el asistente, primer paso, pulsar siguiente.
    tarea02
  3. Siguiente ventana, pulsaremos en Examinar para ir donde tenemos nuestro script, lo elegiremos y pulsaremos en Abrir del correspondiente cuadro de diálogo.
    tarea03
  4. Elegimos un nombre descriptivo para la tarea, y marcamos la secuencia deseada, en este caso diariamente.
    tarea04
  5. Hora de inicio, frecuencia de días y día de inicio, siguiente.
    tarea05
  6. Datos de la cuenta con la que se ejecutará la tarea. Ojo, si la cuenta no tiene suficientes privilegios no ejecutará la tarea o incluso el script.
    tarea06
  7. Si deseamos configurar alguna opción avanzada o sólo comprobarlas, marcaremos la casilla de verificación y pulsamos en Finalizar.
    tarea07
  8. Avanzadas, ventanas Tarea, Programación, Configuración y Seguridad.
    tarea08 tarea09 tarea10 tarea11
  9. La tarea se ha añadido al programador de tareas.
    tarea12

4 comentarios sobre “Monitorizar los Servicios 1”

Responder a anonymous Cancelar respuesta

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