CodeGym /Cursos /Docker SELF /Escribir un script bash sencillo para automatizar tareas ...

Escribir un script bash sencillo para automatizar tareas usando cron

Docker SELF
Nivel 3 , Lección 6
Disponible

Escribir un script bash sencillo para automatizar tareas usando cron

1. Definición del problema

Hoy escribiremos un script real, que verifica la disponibilidad de un sitio web y registra el resultado en un archivo de registro, y luego automatizaremos su ejecución con cron.

¿Qué queremos hacer?

Vamos a crear un script bash que:

  1. Verifique la disponibilidad de un sitio web especificado usando ping.
  2. Registre el resultado de la verificación en un archivo de registro, incluyendo la hora y la fecha.
  3. Ejecútelo automáticamente cada 5 minutos utilizando cron.

¿Por qué es importante?

En el mundo real, el monitoreo de la disponibilidad de sitios web y servidores es una de las tareas clave para los administradores de sistemas. Por ejemplo, si tu sitio (o servidor) de repente deja de responder, querrás saberlo lo antes posible. Este escenario no solo es útil para el monitoreo, sino también en entrevistas laborales o en la práctica diaria.


2. Paso 1: Escribir un script bash simple

Comencemos escribiendo el script bash principal. Aquí tienes una explicación paso a paso de lo que hará:

  1. Estableceremos la dirección del sitio web que necesitamos verificar.
  2. Utilizaremos ping para intentar enviar una solicitud al servidor.
  3. Verificaremos si hemos recibido una respuesta disponible.
  4. Guardaremos el resultado en un archivo de registro.

Vamos a crear el archivo site_check.sh:

#!/bin/bash

# Definimos la dirección del sitio web
WEBSITE="example.com"

# Archivo para registrar resultados
LOG_FILE="/var/log/site_status.log"

# Verificamos la disponibilidad del sitio utilizando ping
if ping -c 1 $WEBSITE &> /dev/null; then
    # Si el sitio está disponible
    echo "$(date): $WEBSITE está disponible" >> $LOG_FILE
else
    # Si el sitio no está disponible
    echo "$(date): $WEBSITE no está disponible" >> $LOG_FILE
fi

Explicación del código:

  1. #!/bin/bash — indica que este script debe ejecutarse utilizando Bash.
  2. WEBSITE="example.com" — dirección del sitio web que necesitamos verificar. Puedes reemplazar example.com con cualquier sitio o servidor que quieras monitorizar.
  3. ping -c 1 $WEBSITE — envía un paquete (-c 1) al sitio especificado. Si el sitio responde, el comando termina con un código 0. Si no, con un error.
  4. &> /dev/null — redirige la salida estándar y errores al "agujero negro" (no queremos ver la salida de ping en la consola).
  5. $(date) — añade la fecha y hora actual al mensaje.
  6. >> $LOG_FILE — añade el resultado al final del archivo de registros.

3. Paso 2: Ejecutar el script manualmente

Antes de automatizar la ejecución del script, asegúrate de que funciona.

  1. Guarda el script en un archivo llamado site_check.sh.

  2. Hazlo ejecutable:

    chmod +x site_check.sh
    
  3. Ejecuta:

    sudo ./site_check.sh
    

Después de ejecutar el script, abre el archivo /var/log/site_status.log para asegurarte de que el resultado de la verificación se agregó al log. Usa el comando:

cat /var/log/site_status.log

Si todo funciona, deberías ver una línea como:

Mon Oct 30 14:35:22 UTC 2023: example.com es accesible

4. Paso 3: Configuración de ejecución automática con cron

Ya sabemos que cron permite ejecutar tareas programadas. Ahora configuraremos cron para que nuestro script se ejecute cada 5 minutos.

Editar crontab

Abre el editor de crontab:

crontab -e

Agrega la siguiente línea:

*/5 * * * * /path/to/site_check.sh

Explicación:

  • */5 — indica que la tarea debe ejecutarse cada 5 minutos.
  • /path/to/site_check.sh — ruta completa a nuestro script. Asegúrate de que sea correcta. Por ejemplo, si el script está en el directorio personal del usuario, la ruta sería algo como /home/your_username/site_check.sh.

Después de guardar los cambios, cron comenzará a ejecutar el script cada 5 minutos. Para asegurarte de que la tarea se ha añadido, ejecuta:

crontab -l

5. Paso 4: Verificar el funcionamiento de cron

Ahora vamos a comprobar si la automatización funciona. Espera 5-10 minutos y vuelve a abrir el archivo de logs:

cat /var/log/site_status.log

Deberías ver nuevos registros que se actualizan cada 5 minutos. Por ejemplo:

Mon Oct 30 14:35:22 UTC 2023: example.com está accesible
Mon Oct 30 14:40:22 UTC 2023: example.com está accesible
Mon Oct 30 14:45:22 UTC 2023: example.com está accesible

6. Análisis de preguntas y errores típicos

  1. Ping devuelve un error 'Permission denied'

    Si ejecutas el script como un usuario normal, puede que no tenga suficientes permisos. Ejecuta el script con sudo o añade permisos de ejecución.

  2. El archivo de logs no se crea

    Asegúrate de que la ruta al archivo de logs (/var/log/site_status.log) está correctamente especificada y que el usuario tiene permisos para escribir en ese directorio. Si el archivo no existe, créalo manualmente usando:

    sudo touch /var/log/site_status.log
    sudo chmod 666 /var/log/site_status.log
    
  3. cron no ejecuta el script

    Comprueba si el servicio cron está funcionando:

    sudo systemctl status cron
    

    Debería estar en estado active (running). Si está detenido, inícialo con:

    sudo systemctl start cron
    
  4. El script no se ejecuta en cron, pero funciona manualmente

    Asegúrate de que la ruta al script y a todos los archivos usados están completamente especificados. En las tareas de cron, las variables de entorno (por ejemplo, $PATH) pueden ser diferentes. Es mejor usar rutas absolutas.


7. Mejoras y tareas adicionales

Filtración de sitios web

Amplía el script para que verifique la disponibilidad de varios sitios web. Por ejemplo:

WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
    if ping -c 1 $SITE &> /dev/null; then
        echo "$(date): $SITE is reachable" >> $LOG_FILE
    else
        echo "$(date): $SITE is unreachable" >> $LOG_FILE
    fi
done

Enviar notificaciones

Agrega el envío de notificaciones si el sitio no está disponible. Por ejemplo, usando el comando mail para enviar un email:

# Notificación por email
if ! ping -c 1 $WEBSITE &> /dev/null; then
    echo "$WEBSITE is down!" | mail -s "Website Check Alert" your_email@example.com
fi

Registro cíclico

Limita el tamaño del archivo de log a, digamos, 1 MB. Si el archivo se vuelve demasiado grande, renómbralo (como un archivo archivado) y comienza un nuevo log.


¡Felicidades! Ahora sabes cómo usar scripts bash y cron para automatizar tareas reales. Estas habilidades son especialmente demandadas para ingenieros DevOps y administradores de sistemas.

1
Опрос
Servicios de Linux,  3 уровень,  6 лекция
недоступен
Servicios de Linux
Servicios de Linux
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION