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
CampoValores posibles
MIN0-59
HORA0-23
DÍA1-31
MES1-12
DÍA_SEMANA0-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ía
  • hourly → cada hora
  • Mon..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:

  1. Comprima la carpeta ~/proyecto en un archivo proyecto_YYYYMMDD.tar.gz.
  2. Guarde el backup en ~/backups.
  3. Prográmalo con cron para ejecutarse cada domingo a las 02:00.
  4. Redirige la salida y los errores a ~/logs/respaldo.log.

🏋️‍♂️ Ejercicio práctico 2

Crea un script alerta_disco.sh que:

  1. Revise el uso de disco con df -h.
  2. Si el disco raíz (/) supera el 80% de uso, envíe un correo (usa mail o simplemente imprima un mensaje).
  3. Prográmalo con cron para 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

  1. ✅ Siempre prueba el script manualmente antes de programarlo.
  2. ✅ Redirige salidas y errores a archivos de log para depurar.
  3. ✅ Usa rutas absolutas en los cron jobs (no confíes en $PATH).
  4. ✅ En producción, considera systemd timers por su robustez y persistencia.
  5. ✅ Mantén los scripts organizados (por ejemplo, en /home/usuario/scripts).
  • Loading...