Usar scripts para monitorear servicios: un ejemplo práctico utilizando funciones

En el post anterior aprendimos los fundamentos del uso de funciones en shell scripts. En este post mostraremos cómo usar scripts para monitorear servicios del sistema. Para hacer este ejemplo más interesante mostraremos el resultado en una página web servida por Apache según lo explicamos anteriormente.

Para poder seguir el ejemplo que presentamos a continuación son necesarios conocimientos básicos de HTML y CSS. Por suerte, el sitio W3Schools provee excelentes tutoriales sobre ambos.

Usar scripts para monitorear servicios del sistema

Para empezar, guardaremos en un archivo llamado estilos.css (dentro de /var/www/html) el siguiente contenido. El mismo nos permitirá dar formato a la página web que generará el script que escribiremos luego:

/* Estilo para el cuerpo de página */
body {
  padding: 25px;
}

/* Estilo para el encabezado h1 */
h1 {
  color: royalblue;
}

/* Estilo para indicar la fecha y hora de última actualización */
#ultact {
  font-style: italic;
}

/* Estilo para un servicio que se encuentra corriendo */
.encendido {
  color: forestgreen;
  font-weight: bold;
}

/* Estilo para un servicio que se encuentra detenido */
.detenido {
  color: firebrick;
  font-weight: bold;
}

Utilizar funciones

El siguiente script (monitor.sh) utiliza la función EstadoServicio para chequear si el servicio que utilizamos como argumento está ejecutándose o no. Como resultado en el primer caso, mostrará un mensaje en negrita color verde, mientras que en el segundo lo hará en color rojo. A continuación, veremos que tanto el directorio destino como el nombre del archivo HTML generado (monitor.html) se guardan en variables para facilitar su uso posterior.

#!/bin/bash

# Directorio destino
DIR=/var/www/html

# Nombre de archivo HTML a generar
ARCHIVO=monitor.html

# Fecha actual
FECHA=$(date +'%d/%m/%Y %H:%M:%S')

# Declaración de la función
EstadoServicio() {
    systemctl --quiet is-active $1
    if [ $? -eq 0 ]; then
        echo "<p>El servicio $1 está <span class='encendido'> ejecutándose</span>.</p>" >> $DIR/$ARCHIVO
    else
        echo "<p>El servicio $1 está <span class='detenido'> detenido</span>.</p>" >> $DIR/$ARCHIVO
    fi
}

# Comienzo de la generación del archivo HTML
# Esta primera parte constitute el esqueleto básico del mismo.
echo "
<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1.0'>
  <meta http-equiv='X-UA-Compatible' content='ie=edge'>
  <title>Monitor de servicios seleccionados del sistema</title>
  <link rel='stylesheet' href='estilos.css'>
</head>
<body>
<h1>Monitor de servicios seleccionados del sistema</h1>
<p id='ultact'>Última actualización: $FECHA</p>
<hr>
" > $DIR/$ARCHIVO

# Servicios a chequear (podemos agregar todos los que deseemos
# El servidor web Apache
EstadoServicio httpd
# El firewall utilizado por defecto en CentOS 7
EstadoServicio firewalld
# Un servicio cualquiera
EstadoServicio miservicio
# El servidor de bases de datos
EstadoServicio mariadb
# sshd
EstadoServicio sshd

# Finalmente, terminamos de escribir el archivo
echo "
</body>
</html>" >> $DIR/$ARCHIVO

El resultado

Luego de ejecutar el script de esta manera

./monitor.sh

podemos entonces abrir nuestro navegador web y abrir la página <IP de nuestro servidor>/monitor.html como vemos en la Fig. 1:

Resultado de usar scripts para monitorear servicios seleccionados del sistema
Figura 1 – Resultado de usar scripts para monitorear servicios seleccionados del sistema

Finalmente, podemos ejecutar el script monitor.sh mediante cron con una frecuencia razonable para tener datos actualizados. Es importante notar que en este post nos hemos valido de este ejemplo para el uso de funciones, pero no significa que sea la única manera de obtener estos datos del sistema.

¡Hasta la próxima!