Cron jobs en Linux: automatiza tareas con ejemplos reales


Cron es el planificador de tareas de Linux. Lleva décadas siendo la herramienta estándar para ejecutar scripts y comandos de forma automática en momentos concretos: backups nocturnos, limpieza de logs, reportes, actualizaciones del sistema. En este artículo aprendemos a usarlo con confianza.

Sintaxis del crontab

Cada línea de un crontab sigue este formato:

┌───── minuto (0-59)
│ ┌───── hora (0-23)
│ │ ┌───── día del mes (1-31)
│ │ │ ┌───── mes (1-12)
│ │ │ │ ┌───── día de la semana (0=domingo, 6=sábado)
│ │ │ │ │

     /ruta/al/comando


Caracteres especiales:

  • * → cualquier valor
  • , → lista de valores: 1,15,30
  • - → rango: 9-17
  • / → intervalo: */5 (cada 5 unidades)

Gestionar el crontab

crontab -e

crontab -l

crontab -u www-data -e

crontab -r

Ejemplos prácticos

Backup diario a las 2:00


0 2   * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Limpieza de archivos temporales cada lunes a las 3:30

30 3   1 find /tmp -type f -mtime +7 -delete

Reporte de uso de disco cada hora

0     df -h | mail -s "Uso de disco $(hostname)" admin@miempresa.com

Reiniciar un servicio si está caído (cada 5 minutos)

/5    * systemctl is-active --quiet nginx || systemctl start nginx

Backup de base de datos PostgreSQL (lunes a viernes a las 1:00)

0 1   1-5 pg_dump -U postgres mibasedatos | gzip > /backups/db_$(date +\%Y\%m\%d).sql.gz

Actualizar un repositorio git a medianoche

0 0   * cd /var/www/miapp && git pull origin main >> /var/log/git-pull.log 2>&1

Carpetas cron.d, cron.daily, cron.weekly

Para tareas del sistema, no hace falta tocar el crontab de usuario. Usa los directorios estándar:

ls /etc/cron.d/        # tareas con formato crontab completo (especifican usuario)
ls /etc/cron.daily/    # scripts que se ejecutan una vez al día
ls /etc/cron.weekly/   # una vez a la semana
ls /etc/cron.monthly/  # una vez al mes

Ejemplo: crear un script en cron.daily:

cat > /etc/cron.daily/limpieza-logs << 'EOF'
#!/bin/bash
find /var/log -name "*.gz" -mtime +30 -delete
journalctl --vacuum-time=30d
EOF
chmod +x /etc/cron.daily/limpieza-logs

Redirigir salida para no recibir emails

Por defecto cron envía emails con la salida de cada tarea (si hay un MTA configurado). Para controlar esto:


0 2   * /script.sh > /dev/null 2>&1


0 2   * /script.sh > /dev/null 2>> /var/log/mi-script-error.log


0 2   * echo "=== $(date) ===" >> /var/log/mi-script.log && /script.sh >> /var/log/mi-script.log 2>&1

Variables de entorno en crontab

El crontab tiene un entorno mínimo. Si tu script usa rutas o variables del sistema, defínelas explícitamente:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=admin@miempresa.com

0 2   * /usr/local/bin/mi-script.sh

Verificar que los jobs se ejecutan


grep CRON /var/log/syslog
journalctl -u cron -f


tail -f /var/log/cron.log

Alternativa moderna: systemd timers

Para sistemas que ya usan systemd, los timers ofrecen más flexibilidad y mejor integración con journald:


[Unit]
Description=Backup diario

[Timer]
OnCalendar=--* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

systemctl enable --now backup.timer
systemctl list-timers

Conclusión

Cron sigue siendo la herramienta estándar para automatización de tareas en Linux por su simplicidad y universalidad. Con la sintaxis bien entendida y la gestión de logs correcta, puedes automatizar desde simples limpiezas hasta pipelines de datos complejos. Para tareas más sofisticadas o con dependencias, considera los systemd timers o herramientas como Ansible.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *