Curso de Shell Scripting
🟢 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).
13.1. 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
13.2. 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>
13.3. 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
13.4. 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.
13.5. 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
🏋️♂️ 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.
🏋️♂️ 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.
🏋️♂️ 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.
✅ 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).
- Loading...