Cómo Monitorizar MySQL, Apache y Nginx con Bash

La estabilidad del servidor depende de que tus servicios principales se mantengan activos. Si MySQL falla o Nginx deja de responder, tus usuarios se enterarán antes que tú, a menos que tengas monitorización.

En esta guía, crearemos un script en bash para verificar el estado de servicios como mysql, apache2, nginx o docker y notificarte inmediatamente vía AlertHub si están caídos.

El Script de Vigilancia

Crearemos un script llamado check_services.sh. Iterará a través de una lista de servicios y verificará su estado usando systemctl.

Consejo: Este script utiliza la función alerthub_alert de nuestra Guía de Webhooks en Bash. ¡Asegúrate de tenerla configurada!

  1. Crea el archivo:
nano ~/check_services.sh
  1. Pega el siguiente contenido:
#!/bin/bash

# Configuración
# Lista de servicios a monitorizar, separados por espacios
SERVICES=("mysql" "nginx" "ssh")

# Cargar función AlertHub
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

# Función para verificar un solo servicio
check_service() {
    local service=$1
    
    if systemctl is-active --quiet "$service"; then
        echo "✅ $service está corriendo"
    else
        echo "❌ $service está CAÍDO"
        
        # Enviar Alerta
        # Usamos un título único por servicio para agrupar alertas efectivamente
        alerthub_alert -t "$service está CAÍDO en $(hostname)" \
                       -d "El servicio '$service' ha dejado de funcionar. Se recomienda intentar reiniciarlo." \
                       -l "critical"
    fi
}

# Bucle por todos los servicios definidos
for service in "${SERVICES[@]}"; do
    check_service "$service"
done

Nota: Si no usas alerthub_alert, puedes reemplazar esa línea con el comando curl crudo mostrado en nuestra guía de Uso de Disco.

Personalizando para tu Stack

Puedes modificar el array SERVICES para incluir lo que necesites.

  • Stack LAMP: SERVICES=("apache2" "mysql")
  • Stack LEMP: SERVICES=("nginx" "mariadb" "php8.1-fpm")
  • Host Docker: SERVICES=("docker" "containerd")

Auto-Reinicio (Opcional)

Puedes llevar este script más allá intentando reiniciar el servicio automáticamente antes de alertar:

if ! systemctl is-active --quiet "$service"; then
    echo "Intentando reiniciar $service..."
    sudo systemctl start "$service"
    sleep 5
    
    if ! systemctl is-active --quiet "$service"; then
        alerthub_alert -t "$service FALLÓ al Recuperarse" -l "critical" -d "El servicio no pudo ser reiniciado automáticamente."
    else
        alerthub_alert -t "$service Reiniciado" -l "warning" -d "El servicio falló pero fue reiniciado exitosamente."
    fi
fi

Programación

Al igual que nuestro monitor de disco, queremos que esto se ejecute con frecuencia. Para la disponibilidad de servicios, verificar cada 5 minutos es el estándar.

Añade esto a tu crontab (crontab -e):

*/5 * * * * /home/tu_usuario/check_services.sh

Conclusión

Con este script, ya no vuelas a ciegas. Ya sea una caída de base de datos o un fallo del servidor web, AlertHub asegura que seas el primero en saberlo, dándote la oportunidad de arreglarlo antes de que los clientes empiecen a quejarse.