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.