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:
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!