Automatización y Scheduling en Bash
1. M13. Automatización y Scheduling en Bash #
Para que los scripts sean realmente útiles, necesitamos programarlos para que se ejecuten automáticamente en momentos concretos: cada hora, cada día, al iniciar el sistema, o solo una vez en el futuro.
Las herramientas más usadas son:
cron→ para tareas recurrentes.at→ para tareas puntuales.systemd timers→ para tareas programadas en sistemas modernos (Linux).
2. cron: el programador clásico de tareas #
Ver tareas programadas del usuario #
1crontab -l
Editar las tareas programadas #
1crontab -e
👉 Abre el editor (por defecto nano o vi) para añadir tareas.
Sintaxis de cron #
MIN HORA DÍA MES DÍA_SEMANA COMANDO
| Campo | Valores posibles |
|---|---|
| MIN | 0-59 |
| HORA | 0-23 |
| DÍA | 1-31 |
| MES | 1-12 |
| DÍA_SEMANA | 0-7 (0 y 7 = domingo) |
Ejemplos #
- Ejecutar un script cada día a las 02:00:
0 2 * * * /home/angel/scripts/backup.sh
- Ejecutar cada lunes a las 08:30:
30 8 * * 1 /home/angel/scripts/reporte.sh
- Ejecutar cada 15 minutos:
*/15 * * * * /home/angel/scripts/monitor.sh
Enviar salida y errores a un archivo de log #
0 1 * * * /home/angel/scripts/limpieza.sh >> /home/angel/logs/limpieza.log 2>&1
3. at: ejecutar tareas una sola vez #
Instalar (en algunas distros):
1sudo apt install at 2sudo systemctl enable --now atd
Programar un script para dentro de 10 minutos:
1at now + 10 minutes -f /home/angel/scripts/aviso.sh
Programar para una fecha/hora específica:
1at 14:00 01/10/2025 -f /home/angel/scripts/reporte.sh
Listar tareas programadas:
1atq
Cancelar una tarea programada:
1atrm <ID>
4. systemd timers (Linux moderno) #
Más robusto y preferible en sistemas con systemd (Ubuntu, Debian, CentOS…).
Crear un servicio para el script #
Archivo: /etc/systemd/system/reporte.service
1[Unit] 2Description=Genera un reporte automático 3 4[Service] 5Type=oneshot 6ExecStart=/home/angel/scripts/reporte.sh
Crear el timer #
Archivo: /etc/systemd/system/reporte.timer
1[Unit] 2Description=Timer para reporte 3 4[Timer] 5OnCalendar=daily 6Persistent=true 7 8[Install] 9WantedBy=timers.target
👉 OnCalendar admite expresiones como:
daily→ cada díahourly→ cada horaMon..Fri 09:00→ lunes a viernes a las 9:00
Activar el timer #
1sudo systemctl daemon-reload 2sudo systemctl enable --now reporte.timer
Ver timers activos:
1systemctl list-timers
5. Ejemplo integrador: backup diario #
Supongamos que tenemos un script /home/angel/scripts/backup_logs.sh:
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4FECHA=$(date +%Y%m%d) 5tar -czf /home/angel/backups/logs_$FECHA.tar.gz /var/log 6echo "Backup creado en /home/angel/backups/"
Programar con cron #
0 3 * * * /home/angel/scripts/backup_logs.sh >> /home/angel/logs/backup.log 2>&1
👉 Se ejecuta cada día a las 03:00 y guarda la salida en un log.
6. Ejemplo integrador: limpieza mensual #
Script /home/angel/scripts/limpieza_tmp.sh:
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4echo "Eliminando archivos temporales antiguos..." 5find /tmp -type f -mtime +7 -delete 6echo "Limpieza completada."
Programar con systemd timers #
/etc/systemd/system/limpieza_tmp.timer
1[Unit] 2Description=Limpieza de temporales 3 4[Timer] 5OnCalendar=monthly 6Persistent=true 7 8[Install] 9WantedBy=timers.target
7. Ejercicio práctico 1 #
Crea un script respaldo_proyecto.sh que:
- Comprima la carpeta
~/proyectoen un archivoproyecto_YYYYMMDD.tar.gz. - Guarde el backup en
~/backups. - Prográmalo con
cronpara ejecutarse cada domingo a las 02:00. - Redirige la salida y los errores a
~/logs/respaldo.log.
8. Ejercicio práctico 2 #
Crea un script alerta_disco.sh que:
- Revise el uso de disco con
df -h. - Si el disco raíz (
/) supera el 80% de uso, envíe un correo (usamailo simplemente imprima un mensaje). - Prográmalo con
cronpara ejecutarse cada hora.
9. Ejercicio práctico 3 #
Usa at para programar que un script mensaje.sh muestre:
Recordatorio: reunión en 5 minutos
… dentro de 5 minutos desde ahora.
10. Buenas prácticas #
- ✅ Siempre prueba el script manualmente antes de programarlo.
- ✅ Redirige salidas y errores a archivos de log para depurar.
- ✅ Usa rutas absolutas en los cron jobs (no confíes en
$PATH). - ✅ En producción, considera
systemd timerspor su robustez y persistencia. - ✅ Mantén los scripts organizados (por ejemplo, en
/home/usuario/scripts).
Resumen del tema
Conceptos clave #
- Programación Recurrente con
cron: edición concrontab -ey expresión de 5 campos (minuto hora día_mes mes día_semana comando >> log.log 2>&1). - Ejecución Puntual Desatendida (
at): programación diferida de una sola ejecución (at now + 10 minutes,atq,atrm). - Temporizadores Modernos con Systemd Timers: pareja formada por servicio
oneshot(.service) y temporizador (.timer) con directivasOnCalendar(daily,hourly) yPersistent=truepara recuperar tareas perdidas si el sistema estuvo apagado. - Buenas Prácticas de Automatización: uso estricto de rutas absolutas para binarios y scripts, y redirección completa de streams (
>> log 2>&1).
Qué debes recordar #
Usa cron para tareas periódicas simples y systemd timers en entornos de producción con persistencia, asegurando siempre rutas absolutas y registro de logs.