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:
- Verifique la disponibilidad de un sitio web especificado usando
ping
. - Registre el resultado de la verificación en un archivo de registro, incluyendo la hora y la fecha.
- 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á:
- Estableceremos la dirección del sitio web que necesitamos verificar.
- Utilizaremos
ping
para intentar enviar una solicitud al servidor. - Verificaremos si hemos recibido una respuesta disponible.
- 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:
#!/bin/bash
— indica que este script debe ejecutarse utilizando Bash.WEBSITE="example.com"
— dirección del sitio web que necesitamos verificar. Puedes reemplazarexample.com
con cualquier sitio o servidor que quieras monitorizar.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.&> /dev/null
— redirige la salida estándar y errores al "agujero negro" (no queremos ver la salida deping
en la consola).$(date)
— añade la fecha y hora actual al mensaje.>> $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.
Guarda el script en un archivo llamado
site_check.sh
.Hazlo ejecutable:
chmod +x site_check.sh
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
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.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
cron
no ejecuta el scriptComprueba 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
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.
GO TO FULL VERSION