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.
Actualizado Publicado 4 min de lectura

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 CloudPanelTener 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 VPSLos 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.
#!/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%"
fiEn 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:
sudo wget -qO /usr/local/bin/ps_mem https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.pyHaz ps_mem ejecutable:
sudo chmod a+x /usr/local/bin/ps_memComprueba la versión:
ps_mem --versionSi 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.
sudo ln -s /usr/bin/python3 /usr/bin/pythonAñadir el script a crontab
Crea un archivo con el script en /opt/scripts o en cualquier ubicación que prefieras:
vi /opt/scripts/cpu-alert.shHaz el archivo ejecutable:
sudo chmod a+x /opt/scripts/cpu-alert.shEjecuta el script:
/opt/scripts/cpu-alert.shLa salida debería llegar al correo:
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:
# 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>&1Lo 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

