Bash Script para Monitorizar el Sistema en Linux

SYSTEM MONITORING BASH SCRIPT

Si ya estás familiarizado con qué es un Bash script, este artículo es perfecto para dar el siguiente paso: implementar un script enfocado en supervisar métricas clave como el uso de CPU, RAM, espacio en disco y los procesos que consumen más recursos. Con un enfoque práctico y orientado a la eficiencia, te enseñaremos cómo hacerlo en Ubuntu.

Objetivos del Bash Script

El objetivo principal de este script es ofrecer datos precisos sobre métricas críticas del sistema. Esto te permitirá tomar decisiones informadas, ya sea en tiempo real o para análisis posterior. A continuación, desglosamos las métricas clave que supervisaremos:

Uso de CPU

El script detectará picos de uso de la CPU e identificará los procesos que consumen más recursos. Esto es esencial para garantizar un rendimiento estable y evitar cuellos de botella.

Memoria RAM

Supervisaremos cuánta memoria está siendo utilizada y cuánto está disponible, lo cual es crucial para aplicaciones que manejan grandes cantidades de datos.

Espacio en Disco

La herramienta te ayudará a monitorear el espacio libre en tus particiones. Con esta información, podrás prevenir problemas de almacenamiento y mantener la eficiencia del sistema.

Procesos Principales

Identificaremos los procesos que generan el mayor impacto en el rendimiento del sistema, permitiéndote priorizar su optimización o resolución.

Beneficios del Script

  • Facilita la identificación de problemas en el sistema.
  • Automatiza la supervisión, ahorrando tiempo y esfuerzo.
  • Proporciona informes claros para un análisis eficiente.

vim chequeo_maquina.sh

chmod +x chequeo_maquina.sh

./chequeo_maquina.sh

===========================================
Chequeo del Estado del Sistema
Fecha: dom 01 dic 2024 00:42:15 CET

=== Resumen del Comando top ===
top – 00:42:15 up 5 days, 14:10, 2 users, load average: 1,52, 0,86, 1,18
Tareas: 477 total, 1 ejecutar, 475 hibernar, 0 detener, 1 zombie
%Cpu(s): 5,6 us, 3,3 sy, 0,0 ni, 91,1 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
MiB Mem : 31800,0 total, 11895,8 libre, 12008,4 usado, 11614,6 búf/caché
MiB Intercambio: 8192,0 total, 8192,0 libre, 0,0 usado. 19791,6 dispon

=== Estado de la CPU ===
Uso de CPU: 6.5 %
Estado: Uso de CPU dentro de límites normales

=== Estado de la Memoria ===
Memoria Total: 31,05 GB
Memoria Usada: 11,73 GB
Memoria Libre: 11,62 GB
Porcentaje de Uso de Memoria: 37,76 %

=== Top 10 Procesos por Consumo de CPU ===
PID PPID CMD %MEM %CPU
52573 39502 /snap/firefox/5361/usr/lib/ 2.1 2.2
61036 52573 /snap/firefox/5361/usr/lib/ 2.4 1.9
39502 39142 /usr/bin/gnome-shell 1.0 1.0
3412 3328 /opt/google/chrome/chrome – 0.7 0.7
53837 39502 /usr/bin/obs 0.7 0.7
66314 39502 gjs /usr/share/gnome-shell/ 0.2 0.7
2363 2105 /usr/bin/gnome-shell 1.0 0.6
11753 11651 /snap/spotify/80/usr/share/ 0.9 0.5
51867 51800 /usr/share/code/code –type 0.8 0.3
3310 2363 /opt/google/chrome/chrome 1.3 0.3

=== Top 10 Procesos por Consumo de Memoria ===
PID PPID CMD %MEM %CPU
3780 3331 /opt/google/chrome/chrome – 6.0 0.1
61036 52573 /snap/firefox/5361/usr/lib/ 2.4 1.9
52573 39502 /snap/firefox/5361/usr/lib/ 2.1 2.2
3310 2363 /opt/google/chrome/chrome 1.3 0.3
53423 52573 /snap/firefox/5361/usr/lib/ 1.2 0.1
11570 2363 /snap/spotify/80/usr/share/ 1.1 0.1
62878 52573 /snap/firefox/5361/usr/lib/ 1.1 0.1
39502 39142 /usr/bin/gnome-shell 1.0 1.0
2363 2105 /usr/bin/gnome-shell 1.0 0.6
33601 3331 /opt/google/chrome/chrome – 1.0 0.0

=== Estado de los Discos ===
Sistema de Archivos Tamaño Usado Disponible % Uso
tmpfs 3,2G 2,8M 3,2G 1%
/dev/nvme0n1p2 468G 38G 407G 9%
tmpfs 16G 1,2G 15G 8%
tmpfs 5,0M 8,0K 5,0M 1%
efivarfs 246K 143K 99K 60%
/dev/nvme0n1p1 1,1G 6,2M 1,1G 1%
tmpfs 3,2G 152K 3,2G 1%
tmpfs 3,2G 2,6M 3,2G 1%

===========================================
Chequeo completado.

Funciones del bash script

show_top_summary:

Muestra las primeras 5 líneas del comando top .

show_top_processes:

  • Lista los 10 procesos que más CPU y memoria consumen, ordenando según los recursos.

check_cpu:

  • Extrae el porcentaje de CPU inactiva desde la salida de top.
  • Calcula el uso de CPU activo (100 – CPU_IDLE).
  • Evalúa si el uso de CPU está por encima del 80% y muestra un estado.

check_memory:

  • Usa el comando free -m para obtener datos de la memoria total, usada y libre.
  • Convierte los valores de MB a GB y calcula el porcentaje de uso de memoria.

check_disks:

  • Obtiene información sobre los discos con df -h y muestra un resumen formateado.

check_system:

  • Ejecuta todas las funciones anteriores y organiza la salida con encabezados claros.

Bash Script: chequeo_maquina.sh

#!/bin/bash

# Función para mostrar las primeras 5 líneas del comando top
show_top_summary() {
    echo "=== Resumen del Comando top ==="
    top -bn1 | head -n 5
    echo
}

# Función para listar los 10 procesos que más consumen recursos
show_top_processes() {
    echo "=== Top 10 Procesos por Consumo de CPU ==="
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 11
    echo
    echo "=== Top 10 Procesos por Consumo de Memoria ==="
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 11
    echo
}

check_cpu() {
    echo "=== Estado de la CPU ==="
    
    # Extraer el porcentaje de CPU inactiva y reemplazar comas por puntos
    CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | sed 's/,/./g')

    # Validar que CPU_IDLE tenga un valor numérico
    if [[ -z "$CPU_IDLE" || ! "$CPU_IDLE" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
        echo "Error: No se pudo obtener el uso de CPU."
        return
    fi

    # Calcular el uso de CPU activo (100 - CPU inactiva)
    CPU_USAGE=$(echo "100 - $CPU_IDLE" | bc 2>/dev/null)

    if [[ -z "$CPU_USAGE" ]]; then
        echo "Error: No se pudo calcular el uso de CPU."
        return
    fi

    echo "Uso de CPU: $CPU_USAGE %"

    # Evaluar estado
    if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
        echo "Estado: Uso alto de CPU"
    else
        echo "Estado: Uso de CPU dentro de límites normales"
    fi
    echo
}

check_disks() {
    echo "=== Estado de los Discos ==="
    
    # Obtener información de los discos
    DISK_INFO=$(df -h --output=source,size,used,avail,pcent | tail -n +2)
    if [ $? -ne 0 ]; then
        echo "Error: No se pudo obtener la información de los discos."
        return 1
    fi
    
    # Mostrar encabezado
    printf "%-20s %10s %10s %10s %10s\n" "Sistema de Archivos" "Tamaño" "Usado" "Disponible" "% Uso"
    
    # Procesar y mostrar información
    echo "$DISK_INFO" | while read -r line; do
        SOURCE=$(echo "$line" | awk '{print $1}')
        SIZE=$(echo "$line" | awk '{print $2}')
        USED=$(echo "$line" | awk '{print $3}')
        AVAIL=$(echo "$line" | awk '{print $4}')
        USAGE=$(echo "$line" | awk '{print $5}')
        
        printf "%-20s %10s %10s %10s %10s\n" "$SOURCE" "$SIZE" "$USED" "$AVAIL" "$USAGE"
    done
    
    echo
}
check_memory() {
echo "=== Estado de la Memoria ==="
    MEM_INFO=$(free -m)
    TOTAL_MEM_MB=$(echo "$MEM_INFO" | awk '/^Mem:/ {print $2}')  # Memoria total en MB
    USED_MEM_MB=$(echo "$MEM_INFO" | awk '/^Mem:/ {print $3}')   # Memoria usada en MB
    FREE_MEM_MB=$(echo "$MEM_INFO" | awk '/^Mem:/ {print $4}')   # Memoria libre en MB
    
    # Convertir MB a GB
    TOTAL_MEM=$(awk "BEGIN {printf \"%.2f\", $TOTAL_MEM_MB / 1024}")
    USED_MEM=$(awk "BEGIN {printf \"%.2f\", $USED_MEM_MB / 1024}")
    FREE_MEM=$(awk "BEGIN {printf \"%.2f\", $FREE_MEM_MB / 1024}")
    
    # Calcular porcentaje de uso
    MEM_USAGE_PERCENT=$(awk "BEGIN {printf \"%.2f\", ($USED_MEM_MB / $TOTAL_MEM_MB) * 100}")
    
    # Mostrar resultados
    printf "Memoria Total: %10s GB\n" "$TOTAL_MEM"
    printf "Memoria Usada: %10s GB\n" "$USED_MEM"
    printf "Memoria Libre: %10s GB\n" "$FREE_MEM"
    printf "Porcentaje de Uso de Memoria: %6.2f %%\n" "$MEM_USAGE_PERCENT"
    echo
}
# Función principal
check_system() {
    echo "==========================================="
    echo "Chequeo del Estado del Sistema"
    echo "Fecha: $(date)"
    echo "==========================================="
    echo
    show_top_summary
    check_cpu
    check_memory
    show_top_processes
    check_disks
    echo "==========================================="
    echo "Chequeo completado."
}

# Ejecutar función principal
check_system

Cómo usarlo

1) Guardar el script:

Pega el código de arriba en un archivo llamado chequeo_maquina.sh.

Para ello utiliza cualquier editor de texto, o utiliza la interfaz grafica.

vim chequeo_maquina.sh

2)Hacerlo ejecutable:

chmod +x chequeo_maquina.sh

3)Ejecutar el script: ./chequeo_maquina.sh

./chequeo_maquina.sh

Comentarios

No hay comentarios aún. ¿Por qué no comienzas el debate?

Deja una respuesta

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