REFERENCIA RÁPIDA DE CRON
Programación de tareas, sintaxis crontab, cadenas especiales, logging
Sintaxis
Formato Crontab
# ┌───── minuto (0-59)
# │ ┌───── hora (0-23)
# │ │ ┌───── día del mes (1-31)
# │ │ │ ┌───── mes (1-12)
# │ │ │ │ ┌───── día de la semana (0-7, 0&7=Dom)
# * * * * * comando
Valores de Campo
| * | Cualquier valor (comodín) |
| , | Lista de valores: 1,3,5 |
| - | Rango: 1-5 |
| / | Paso: */10 (cada 10) |
| 0-59 | Rango de minutos |
| 0-23 | Rango de horas |
| 1-31 | Rango de día del mes |
| 1-12 | Rango de mes (o ENE-DIC) |
| 0-7 | Día de la semana (0&7=Dom, o DOM-SAB) |
Cadenas Especiales
Horarios Abreviados
| @reboot | Ejecutar una vez al inicio |
| @yearly | 0 0 1 1 * — una vez al año (1 de enero) |
| @monthly | 0 0 1 * * — una vez al mes (día 1) |
| @weekly | 0 0 * * 0 — una vez a la semana (domingo) |
| @daily | 0 0 * * * — una vez al día (medianoche) |
| @hourly | 0 * * * * — una vez por hora |
Ejemplos
Horarios Comunes
30 2 * * * /usr/local/bin/backup.sh
0 9 * * 1-5 /opt/report.sh
*/15 * * * * /usr/bin/health-check.sh
0 0 1 * * /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
Desglose de Horarios
| 30 2 * * * | Diariamente a las 2:30 AM |
| 0 9 * * 1-5 | Días de semana a las 9:00 AM |
| */15 * * * * | Cada 15 minutos |
| 0 0 1 * * | Primer día del mes, medianoche |
| 0 8,17 * * * | Diariamente a las 8 AM y 5 PM |
Entorno
Establecer Variables
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
HOME=/home/deploy
* * * * * /opt/myjob.sh
Notas de Entorno
| SHELL | Shell para ejecutar comandos (por defecto /bin/sh) |
| PATH | Ruta de búsqueda (cron usa una mínima por defecto) |
| MAILTO | Enviar salida a este correo (vacío = sin correo) |
| HOME | Directorio home para el trabajo cron |
Logging
Salida y Logging
# redirigir stdout + stderr a un archivo de log
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# descartar toda la salida
0 3 * * * /opt/job.sh > /dev/null 2>&1
# registrar solo errores
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
Ver Logs de Cron
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
Horarios Comunes
Patrones Cotidianos
| 0 * * * * | Cada hora en punto |
| */5 * * * * | Cada 5 minutos |
| */30 * * * * | Cada 30 minutos |
| 0 0 * * * | Diariamente a medianoche |
| 0 6 * * 1 | Cada lunes a las 6 AM |
| 0 0 1,15 * * | Días 1 y 15 del mes |
| 0 0 * * 5 | Cada viernes a medianoche |
| 0 0 1 1 * | Cada 1 de enero |
Comandos crontab
Gestionar Crontabs
crontab -e # editar tu crontab
crontab -l # listar tu crontab
crontab -r # eliminar tu crontab
crontab -u alice -l # listar crontab de otro usuario (root)
crontab /path/to/file # instalar crontab desde archivo
Ubicaciones de Crontab del Sistema
| /etc/crontab | Crontab del sistema (incluye campo de usuario) |
| /etc/cron.d/ | Archivos cron de complemento |
| /etc/cron.daily/ | Scripts ejecutados diariamente |
| /etc/cron.hourly/ | Scripts ejecutados cada hora |
| /etc/cron.weekly/ | Scripts ejecutados semanalmente |
| /etc/cron.monthly/ | Scripts ejecutados mensualmente |
| /var/spool/cron/ | Almacenamiento de crontab por usuario |
Consejos
Buenas Prácticas
| Usar rutas absolutas | El PATH de cron es mínimo; usar siempre rutas completas |
| Redirigir salida | Evitar desbordamiento de correos con > /dev/null 2>&1 |
| Archivos de lock | Usar flock para evitar ejecuciones superpuestas |
| Probar primero | Ejecutar el comando manualmente antes de programarlo |
| Usar MAILTO | Configurar MAILTO="" para suprimir todo el correo |
| Verificar zona horaria | Cron usa la hora del sistema; verificar con date |
Evitar Solapamiento con flock
# ejecutar solo si no está ya en ejecución
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh