Logotipo de Bitdoze

Monitorizar el uso de la CPU y enviar alertas por correo electrónico en Linux

Veamos cómo monitorizar el uso de la CPU en un servidor y recibir correos electrónicos.

Dragos

Actualizado Publicado 4 min de lectura

Monitorizar el uso de la CPU y enviar alertas por correo electrónico en Linux

Monitorizar la CPU es muy importante en un servidor Linux, ya que puede haber casos en los que tus aplicaciones necesiten más CPU y acaben consumiéndola por completo. Querrás recibir una notificación por correo electrónico si el uso de la CPU se dispara y tienes que hacer algunas comprobaciones.

Si te interesa monitorizar los recursos del servidor, como la CPU, la memoria o el espacio en disco, puedes consultar: Cómo monitorizar recursos del servidor y Docker

Para que tu servidor pueda enviar correos necesitarás tener configurado un relay SMTP o un servidor de correo alojado en el VPS que se encargue de enviar la alarma.

Si usas un proveedor de VPS online como Hetzner o DigitalOcean, un script de este tipo puede ser muy útil, ya que puede detectar problemas que provengan de tu proveedor de hosting o de tu aplicación. Para más detalles sobre Hetzner, puedes consultar esta reseña.

En este artículo configuraremos un script que se ejecutará en crontab cada 5 minutos y comprobará si el uso de la CPU supera el 80 %; si eso ocurre, recibirás un correo electrónico con:

  • El uso actual
  • Los 20 procesos que más CPU consumen
  • Los 10 procesos que más CPU consumen según el comando ps
  • El uso de memoria del servidor

Si te interesa tener un panel web que te ayude a gestionar tus aplicaciones y pueda usarse como proxy inverso, puedes echar un vistazo al siguiente curso:

Curso de configuración de CloudPanel

Tener todo esto en un correo nos ayudará a entender mejor qué está pasando en el servidor que tenemos. Para construir el script vamos a usar comandos de shell.

DigitalOcean 100 $ gratis Vultr 100 $ gratis Hetzner 20 € gratis Hostinger VPS

Los precios de los VPS subieron en todos los proveedores en 2026 — si estás replanteándote una máquina alquilada, mira qué cambió y cuándo gana un mini PC.

Video de YouTube con los detalles

El script de shell que vamos a usar

A continuación está el script que vamos a utilizar para monitorizar el uso de la CPU; te servirá tanto para versiones de Ubuntu como 20.04 o 22.04 como para distribuciones de RedHat.

text
    #!/bin/bash
    cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}'|cut -f 1 -d "."`
    cpuuse=`expr 100 - $cpu_idle`
    date=$(date '+%Y-%m-%d %H:%M:%S')
    if [ "$cpuuse" -ge 80 ]; then
    SUBJECT="ATTENTION: CPU load is high on $(hostname) at $(date)"
    MESSAGE="/tmp/Mail.out"
    TO="[email protected]"
      echo "CPU current usage is: $cpuuse%" >> $MESSAGE
      echo "" >> $MESSAGE
      echo "+------------------------------------------------------------------+" >> $MESSAGE
      echo "Top 20 processes that consume high CPU" >> $MESSAGE
      echo "+------------------------------------------------------------------+" >> $MESSAGE
      echo "$(top -bn1 | head -20)" >> $MESSAGE
      echo "" >> $MESSAGE
      echo "+------------------------------------------------------------------+" >> $MESSAGE
      echo "Top 10 Processes which consuming high CPU using the ps command" >> $MESSAGE
      echo "+------------------------------------------------------------------+" >> $MESSAGE
      echo "$(ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10)" >> $MESSAGE
      echo "Memory Utilization on the server" >> $MESSAGE
      echo "+------------------------------------------------------------------+" >> $MESSAGE
      echo "$(ps_mem)" >> $MESSAGE
      mail -s "$SUBJECT" "$TO" < $MESSAGE
      rm /tmp/Mail.out
    else
    echo "$date: Server CPU usage is in under threshold.CPU current usage is: $cpuuse%"
      fi

En este script tienes que cambiar el TO por tu correo electrónico y, si quieres modificar el umbral, poner el valor que prefieras en el -ge 80 (ahora es 80).

Activar el script de monitorización de CPU

Instalar ps_mem

Es una herramienta que te muestra de forma más clara el uso de memoria por proceso; para instalarla haz lo siguiente:

Obtén ps_mem:

text
      sudo wget -qO /usr/local/bin/ps_mem https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py

Haz ps_mem ejecutable:

text
sudo chmod a+x /usr/local/bin/ps_mem

Comprueba la versión:

text
      ps_mem --version

Si recibes el mensaje de error /usr/bin/env: ‘python’: No such file or directory, tienes que crear un enlace simbólico para /usr/bin/python. En Ubuntu 20.04 o Ubuntu 22.04 solo viene instalado Python 3 por defecto.

text
      sudo ln -s /usr/bin/python3 /usr/bin/python

Añadir el script a crontab

Crea un archivo con el script en /opt/scripts o en cualquier ubicación que prefieras:

text
vi /opt/scripts/cpu-alert.sh

Haz el archivo ejecutable:

text
sudo chmod a+x /opt/scripts/cpu-alert.sh

Ejecuta el script:

text
      /opt/scripts/cpu-alert.sh

La salida debería llegar al correo:

text
    CPU current usage is: 5%
    +------------------------------------------------------------------+
    Top 20 processes that consume high CPU
    +------------------------------------------------------------------+
    top - 11:27:12 up 6 days, 4:31, 1 user, load average: 0.08, 0.08, 0.07
    Tasks: 204 total, 1 running, 202 sleeping, 0 stopped, 1 zombie
    %Cpu(s): 4.1 us, 0.0 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    MiB Mem : 3827.7 total, 556.1 free, 1427.2 used, 1844.4 buff/cache
    MiB Swap: 2048.0 total, 1276.7 free, 771.3 used. 1454.0 avail Mem
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    1959 clp 20 0 1355012 63248 21020 S 6.2 1.6 127:54.60 beam.smp
    1 root 20 0 168072 9940 6204 S 0.0 0.3 2:35.24 systemd
    2 root 20 0 0 0 0 S 0.0 0.0 0:00.11 kthreadd
    3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
    4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
    5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
    7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-events_highpri
    10 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
    11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
    12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_trace
    13 root 20 0 0 0 0 S 0.0 0.0 3:41.85 ksoftirqd/0
    14 root 20 0 0 0 0 I 0.0 0.0 9:58.13 rcu_sched
    15 root rt 0 0 0 0 S 0.0 0.0 0:01.65 migration/0
    +------------------------------------------------------------------+
    Top 10 Processes that consume high CPU using the ps command
    +------------------------------------------------------------------+
    %CPU PID USER COMMAND
    5.0 596375 btdo php-fpm: pool btdo.uk
    3.5 1039 mysql /usr/sbin/mariadbd
    1.4 1959 clp /app/erts-12.0/bin/beam.smp -- -root /app -progname erl -- -home /app -- -noshell -s elixir start_cli -mode embedded -setcookie S4WHAF4LH5WHSPWUHPKIVMSFISQKQJVFWEGHSP7YW6MT5LKCNDCA==== -sname plausible -config /app/releases/0.0.1/sys -boot /app/releases/0.0.1/start -boot_var RELEASE_LIB /app/lib -- -extra --no-halt
    1.2 772 redis /usr/bin/redis-server 127.0.0.1:6379
    0.6 2677 systemd+ /usr/bin/clickhouse-server --config-file=/etc/clickhouse-server/config.xml
    0.4 579396 root nginx: worker process
    0.3 2071 root node server/server.js
    0.1 789 root /usr/bin/containerd
    0.1 14 root [rcu_sched]
    Memory Utilization on the server
    +------------------------------------------------------------------+
    Private + Shared = RAM used    Program
    4.0 KiB + 25.5 KiB = 29.5 KiB    erl_child_setup
    40.0 KiB + 24.5 KiB = 64.5 KiB    epmd
    4.0 KiB + 82.5 KiB = 86.5 KiB    dumb-init
    56.0 KiB + 108.5 KiB = 164.5 KiB    inet_gethost (3)
    144.0 KiB + 56.5 KiB = 200.5 KiB    cron
    148.0 KiB + 52.5 KiB = 200.5 KiB    atd
    320.0 KiB + 0.5 KiB = 320.5 KiB    exim4
    192.0 KiB + 136.0 KiB = 328.0 KiB    agetty (2)
    268.0 KiB + 89.5 KiB = 357.5 KiB    qemu-ga
    340.0 KiB + 104.5 KiB = 444.5 KiB    irqbalance
    304.0 KiB + 361.5 KiB = 665.5 KiB    master
    352.0 KiB + 361.0 KiB = 713.0 KiB    chronyd (2)
    384.0 KiB + 358.5 KiB = 742.5 KiB    unattended-upgr
    728.0 KiB + 111.5 KiB = 839.5 KiB    systemd-udevd
    652.0 KiB + 339.5 KiB = 991.5 KiB    polkitd
    732.0 KiB + 418.5 KiB = 1.1 MiB    systemd-logind
    920.0 KiB + 243.5 KiB = 1.1 MiB    dbus-daemon
    800.0 KiB + 391.5 KiB = 1.2 MiB    systemd-networkd
    4.0 KiB + 1.3 MiB = 1.3 MiB    clckhouse-watch
    820.0 KiB + 516.5 KiB = 1.3 MiB    systemd-resolved
    1.4 MiB + 128.5 KiB = 1.5 MiB    rsyslogd
    328.0 KiB + 1.2 MiB = 1.5 MiB    php-fpm7.1
    660.0 KiB + 902.5 KiB = 1.5 MiB    qmgr
    708.0 KiB + 878.5 KiB = 1.5 MiB    pickup
    1.3 MiB + 458.5 KiB = 1.8 MiB    ModemManager
    776.0 KiB + 1.2 MiB = 1.9 MiB    php-fpm7.2
    2.0 MiB + 49.5 KiB = 2.0 MiB    proftpd
    924.0 KiB + 1.2 MiB = 2.1 MiB    php-fpm7.3
    1.6 MiB + 533.5 KiB = 2.2 MiB    udisksd
    2.5 MiB + 1.1 MiB = 3.6 MiB    tlsmgr
    2.3 MiB + 1.4 MiB = 3.7 MiB    bash (2)
    3.3 MiB + 992.5 KiB = 4.3 MiB    networkd-dispat
    4.3 MiB + 73.5 KiB = 4.4 MiB    memcached
    4.2 MiB + 754.0 KiB = 4.9 MiB    docker-proxy (4)
    3.6 MiB + 1.5 MiB = 5.1 MiB    sshd (2)
    5.4 MiB + 5.0 MiB = 10.5 MiB    systemd (3)
    11.1 MiB + 35.5 KiB = 11.1 MiB    clp-agent
    12.3 MiB + 1.6 MiB = 13.9 MiB    containerd-shim-runc-v2 (5)
    14.5 MiB + 2.6 MiB = 17.1 MiB    php-fpm8.0
    17.4 MiB + 23.5 KiB = 17.4 MiB    containerd
    18.9 MiB + 170.5 KiB = 19.0 MiB    redis-server
    17.0 MiB + 3.8 MiB = 20.8 MiB    php-fpm8.1 (2)
    21.4 MiB + 751.5 KiB = 22.2 MiB    multipathd
    13.9 MiB + 10.2 MiB = 24.1 MiB    systemd-journald
    28.5 MiB + 178.5 KiB = 28.6 MiB    dockerd
    28.9 MiB + 1.3 MiB = 30.2 MiB    clickhouse
    29.6 MiB + 15.6 MiB = 45.2 MiB    postgres (18)
    40.1 MiB + 6.0 MiB = 46.0 MiB    php-fpm7.4 (2)
    47.2 MiB + 8.0 MiB = 55.3 MiB    beam.smp
    82.3 MiB + 82.5 KiB = 82.4 MiB    node
    72.0 MiB + 30.0 MiB = 102.0 MiB    nginx (8)
    807.7 MiB + 398.5 KiB = 808.1 MiB    mariadbd
    ---------------------------------
    1.4 GiB
    =================================

Activar el script en crontab y crear un log de la ejecución:

text
    # abrir crontab en modo edición
    contab -e
    # añadir la siguiente línea
    */5 * * * * /bin/bash /opt/scripts/cpu-alert.sh >> /opt/scripts/cpu_check_cron.log 2>&1

Lo anterior creará un log en /opt/scripts/cpu_check_cron.log con la salida generada cuando no se está enviando un correo.

DigitalOcean 100 $ gratis Vultr 100 $ gratis Hetzner 20 € gratis Hostinger VPS