Page cover

Servicios y cronjobs

Dentro de la monitorización de servicios, un buen uso es el de cronjobs con correo.

  • Tienes más info sobre cronjobs en: apuntes

  • Un requisito indispensable para que funcione esto es tener postfix y mailutils en el servidor por lo que te recomiendo te mires la siguiente guia: Mailing

Ejemplo 1) Enviar un correo con un reporte diario

Este cronjob enviará un correo con la fecha y hora actuales usando mail.

Creamos un script:

nano ~/reporte_diario.sh

Añade este contenido:

#!/bin/bash

# Variables
FECHA=$(date "+%Y-%m-%d")
HORA=$(date "+%H:%M:%S")
DESTINATARIO="admin@example.com"
ASUNTO="Reporte Diario - $FECHA"
MENSAJE="Hola, este es el reporte diario. La hora actual es: $HORA"

# Enviar correo
echo "$MENSAJE" | mail -s "$ASUNTO" "$DESTINATARIO"

Guarda (Ctrl + X, Y, Enter) y dale permisos de ejecución:

chmod +x ~/reporte_diario.sh

Agregar el cronjob para que se ejecute todos los días a las 8 AM:

crontab -e

Añade esta línea:

0 8 * * * ~/reporte_diario.sh


Ejemplo 2) Enviar un correo si el servidor está casi sin espacio

Este cronjob revisa si el espacio en disco es menor al 10% y envía una alerta.

Crea el script:

nano ~/check_espacio.sh

Añade este contenido:

#!/bin/bash

# Variables
DISPONIBLE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
DESTINATARIO="admin@example.com"
FECHA=$(date "+%Y-%m-%d %H:%M:%S")

# Si el espacio en disco es menor al 10%, enviar alerta
if [ "$DISPONIBLE" -ge 90 ]; then
    ASUNTO="ALERTA: Espacio en disco bajo ($DISPONIBLE%)"
    MENSAJE="Atención: El servidor tiene solo un $((100-DISPONIBLE))% de espacio libre. Fecha: $FECHA"
    echo "$MENSAJE" | mail -s "$ASUNTO" "$DESTINATARIO"
fi

Guarda (Ctrl + X, Y, Enter) y da permisos de ejecución

chmod +x ~/check_espacio.sh

Agregar el cronjob para revisar cada hora

crontab -e

Añade esta línea:

0 * * * * ~/check_espacio.sh


Ejemplo 3) Enviar un correo si un servicio está caído

Este cronjob revisa si Nginx está funcionando y envía un correo si no lo está, ten en cuenta que, obviamente esto no funcionará para servicios como bind9, postfix o dovecot; pero si para docker o mysql.

Primero, creamos el script

nano ~/check_nginx.sh

Añade este contenido:

#!/bin/bash

# Variables
SERVICIO="nginx"
DESTINATARIO="admin@example.com"
FECHA=$(date "+%Y-%m-%d %H:%M:%S")

# Verificar si Nginx está corriendo
if ! systemctl is-active --quiet $SERVICIO; then
    ASUNTO="ALERTA: $SERVICIO está caído - $FECHA"
    MENSAJE="El servicio $SERVICIO ha dejado de funcionar en el servidor. Fecha: $FECHA"
    echo "$MENSAJE" | mail -s "$ASUNTO" "$DESTINATARIO"
fi

Guarda (Ctrl + X, Y, Enter) y da permisos de ejecución

chmod +x ~/check_nginx.sh

Agregamos el cronjob para que revise cada 5 minutos

crontab -e

Añade esta línea:

*/5 * * * * ~/check_nginx.sh

Verificar que los cronjobs funcionan

Para listar las tareas de cron configuradas:

crontab -l

Para revisar si se están enviando los correos, revisa el log del correo:

sudo tail -f /var/log/mail.log

Última actualización