Construye un monitor de sistema Linux utilizando Bash

LinuxBeginner
Practicar Ahora

Introducción

En este proyecto, crearás un monitor de sistema Linux utilizando un script de shell. Este script seguirá continuamente el uso de la CPU, la memoria y el disco de tu sistema, mostrando los porcentajes de uso en tiempo real. Si el uso de cualquier recurso supera un umbral preestablecido, se mostrará una alerta. Al completar este proyecto, aprenderás habilidades básicas de scripting en Linux mientras construyes una herramienta práctica.

Linux System Monitor

🎯 Tareas

Al completar este proyecto, lograrás lo siguiente:

  • Aprender a crear un script de shell para monitorear los recursos del sistema.
  • Comprender cómo establecer y utilizar valores umbral para el uso de la CPU, la memoria y el disco.
  • Crear una función para enviar alertas cuando se superen los umbrales.

🏆 Logros

Después de completar este proyecto, podrás:

  • Crear y ejecutar un monitor de sistema Linux utilizando un script de shell.
  • Comprender cómo trabajar con comandos de recursos del sistema como top, free y df.
  • Estar capacitado para extender el script agregando nuevas características, como notificaciones por correo electrónico.
Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel intermedio con una tasa de finalización del 63%. Ha recibido una tasa de reseñas positivas del 99% por parte de los estudiantes.

Configuración del proyecto

Comienza preparando un espacio de trabajo limpio para tu script. Recomendamos utilizar WebIDE para este proyecto, ya que es adecuado para codificar y probar scripts.

Navega hasta este directorio y crea un archivo llamado system_monitor.sh:

cd ~/project
touch system_monitor.sh
Creating system monitor script

Abre el archivo en tu editor de texto favorito y agrega las siguientes líneas:

#!/bin/bash

## Define the threshold values for CPU, memory, and disk usage (in percentage)
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80

A continuación, se explica lo que hace cada parte del código:

  • #!/bin/bash: Esta línea especifica que el script se interpretará utilizando la shell Bash.
  • CPU_THRESHOLD=80: Establece el umbral de uso de la CPU en un 80%. Puedes ajustar este valor más adelante.
  • MEMORY_THRESHOLD=80 y DISK_THRESHOLD=80: De manera similar, estos definen los umbrales para el uso de la memoria y el disco.

Guarda el archivo y dale permisos de ejecución:

chmod +x system_monitor.sh

Agregar una función de alerta

Ahora, agreguemos una función para enviar alertas cuando el uso de los recursos supere los umbrales. Abre system_monitor.sh y agrega el siguiente código:

## Function to send an alert
send_alert() {
  echo "$(tput setaf 1)ALERT: $1 usage exceeded threshold! Current value: $2%$(tput sgr0)"
}

A continuación, se detalla esta función:

  • send_alert: La función toma dos argumentos:
    • $1 representa el tipo de recurso (por ejemplo, CPU, Memoria, Disco).
    • $2 representa el porcentaje de uso actual.
  • tput setaf 1: Cambia el color del texto a rojo para hacer que las alertas sean visualmente distintas.
  • tput sgr0: Restablece el formato del texto a normal después del mensaje de alerta.

Agrega una llamada de prueba a la función para verificar que funcione:

send_alert "CPU" 85
alert function code snippet

Ejecuta el script:

./system_monitor.sh

Deberías ver un mensaje de alerta en rojo similar a:

ALERT: CPU usage exceeded threshold! Current value: 85%

Antes de continuar, elimina la llamada de prueba a send_alert del script.

Monitoreo del uso de la CPU

Agreguemos la lógica para monitorear el uso de la CPU. Abre el script y agrega el siguiente código:

## Monitor CPU usage
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
cpu_usage=${cpu_usage%.*} ## Convert to integer
echo "Current CPU usage: $cpu_usage%"

if ((cpu_usage >= CPU_THRESHOLD)); then
  send_alert "CPU" "$cpu_usage"
fi

A continuación, se explica lo que sucede en este código:

  1. top -bn1: Ejecuta el comando top en modo batch durante una iteración para obtener las estadísticas de la CPU en tiempo real.
  2. grep "Cpu(s)": Filtra la salida para centrarse en la línea de uso de la CPU.
  3. awk '{print $2 + $4}': Extrae y suma los porcentajes de uso de la CPU por parte del usuario y del sistema.
  4. cpu_usage=${cpu_usage%.*}: Elimina la parte decimal para simplificar las comparaciones con el umbral.
  5. if ((cpu_usage >= CPU_THRESHOLD)): Compara el uso de la CPU con el umbral y llama a send_alert si se supera.

Ejecuta el script para probar el monitoreo de la CPU:

./system_monitor.sh

Deberías ver el uso de la CPU mostrado. Si está por encima del umbral, verás una alerta.

Monitoreo del uso de memoria

A continuación, agrega código para monitorear el uso de la memoria. Inserta las siguientes líneas debajo de la lógica de monitoreo de la CPU:

## Monitor memory usage
memory_usage=$(free | awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}')
echo "Current memory usage: $memory_usage%"
memory_usage=${memory_usage%.*}
if ((memory_usage >= MEMORY_THRESHOLD)); then
  send_alert "Memory" "$memory_usage"
fi

Así es cómo funciona:

  1. free: Proporciona estadísticas de uso de la memoria.
  2. awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}': Calcula el porcentaje de memoria en uso dividiendo la memoria utilizada ($3) entre la memoria total ($2).
  3. El script compara memory_usage con el umbral y envía una alerta si es necesario.

Ejecuta el script:

./system_monitor.sh

Deberías ver el porcentaje de uso de la memoria, y se activarán alertas si el uso supera el umbral.

Monitoreo del uso del disco

Ahora, vamos a monitorear el uso del disco. Agrega el siguiente código debajo de la lógica de monitoreo de la memoria:

## Monitor disk usage
disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
disk_usage=${disk_usage%?} ## Remove the % sign
echo "Current disk usage: $disk_usage%"

if ((disk_usage >= DISK_THRESHOLD)); then
  send_alert "Disk" "$disk_usage"
fi

Explicación:

  1. df -h /: Obtiene las estadísticas de uso del disco para el directorio raíz.
  2. awk '/\// {print $(NF-1)}': Extrae la columna del porcentaje de uso.
  3. disk_usage=${disk_usage%?}: Elimina el símbolo % para facilitar las comparaciones.
  4. Se activan alertas si el uso del disco supera el umbral.

Ejecuta el script:

./system_monitor.sh

Deberías ver las estadísticas de uso del disco, y se activarán alertas si es necesario.

Combinar todo en un bucle

Finalmente, combina el monitoreo de la CPU, la memoria y el disco en un bucle para un monitoreo continuo. Reemplaza el contenido existente con esto:

while true; do
  ## Monitor CPU
  cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
  cpu_usage=${cpu_usage%.*}
  if ((cpu_usage >= CPU_THRESHOLD)); then
    send_alert "CPU" "$cpu_usage"
  fi

  ## Monitor memory
  memory_usage=$(free | awk '/Mem/ {printf("%3.1f", ($3/$2) * 100)}')
  memory_usage=${memory_usage%.*}
  if ((memory_usage >= MEMORY_THRESHOLD)); then
    send_alert "Memory" "$memory_usage"
  fi

  ## Monitor disk
  disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
  disk_usage=${disk_usage%?}
  if ((disk_usage >= DISK_THRESHOLD)); then
    send_alert "Disk" "$disk_usage"
  fi

  ## Display current stats
  clear
  echo "Resource Usage:"
  echo "CPU: $cpu_usage%"
  echo "Memory: $memory_usage%"
  echo "Disk: $disk_usage%"
  sleep 2
done

Este bucle monitorea y actualiza continuamente el uso de los recursos, limpiando la pantalla y mostrando las estadísticas actuales a intervalos regulares.

Ejecuta el script para probarlo:

./system_monitor.sh

Resumen

¡Felicidades! Has creado un monitor de sistema Linux completamente funcional utilizando Bash. Esta herramienta realiza un seguimiento del uso de la CPU, la memoria y el disco en tiempo real, y te alerta si el uso supera los umbrales predefinidos. Siéntete libre de ampliar el script agregando funciones como notificaciones por correo electrónico o monitoreando recursos adicionales.

Linux System Monitor