Hoja de Referencia de Expresiones Cron — Programa Tareas como un Profesional
Cron es la columna vertebral de la automatización de tareas programadas en sistemas tipo Unix. Ya sea que estés rotando logs, ejecutando copias de seguridad de bases de datos o activando pipelines CI/CD, las expresiones cron definen cuándo se ejecutan esas tareas. La sintaxis es compacta pero potente — y fácil de equivocarse si estás adivinando.
Esta referencia cubre cada parte de la sintaxis cron con ejemplos prácticos listos para copiar y pegar. Si quieres construir y validar expresiones de forma interactiva, abre el Constructor de Expresiones Cron junto con esta guía.
Sintaxis Cron: Los Cinco Campos
Una expresión cron estándar consta de cinco campos separados por espacios:
┌───────────── minuto (0–59)
│ ┌───────────── hora (0–23)
│ │ ┌───────────── día del mes (1–31)
│ │ │ ┌───────────── mes (1–12)
│ │ │ │ ┌───────────── día de la semana (0–7, donde 0 y 7 = Domingo)
│ │ │ │ │
* * * * *
Cada campo acepta un valor específico, un rango, una lista o un comodín. Juntos, los cinco campos especifican un horario recurrente exacto.
| Campo | Valores Permitidos | Caracteres Especiales |
|---|---|---|
| Minuto | 0–59 | * , - / |
| Hora | 0–23 | * , - / |
| Día del Mes | 1–31 | * , - / |
| Mes | 1–12 | * , - / |
| Día de la Semana | 0–7 | * , - / |
Los campos de mes y día de la semana también aceptan abreviaturas de tres letras (JAN–DEC, SUN–SAT) en la mayoría de implementaciones.
Caracteres Especiales Explicados
Comprender cuatro caracteres especiales desbloquea todo el poder de cron:
Asterisco * — "Cada"
Coincide con todos los valores posibles para ese campo.
* * * * * # Cada minuto de cada hora de cada día
Coma , — "Y"
Especifica una lista de valores discretos.
0 9,12,18 * * * # A las 9:00 AM, 12:00 PM y 6:00 PM diariamente
Guión - — "Hasta"
Define un rango inclusivo.
0 9-17 * * * # Cada hora desde las 9 AM hasta las 5 PM
Barra / — "Cada n-ésimo"
Establece un intervalo de paso desde el inicio del rango.
*/10 * * * * # Cada 10 minutos (0, 10, 20, 30, 40, 50)
Puedes combinar un rango con un paso:
0 9-17/2 * * * # Cada 2 horas de 9 AM a 5 PM (9, 11, 13, 15, 17)
Ejemplos Comunes de Horarios Cron
Guarda esta tabla en favoritos. Estos son los horarios que usarás una y otra vez.
| Horario | Expresión | Explicación |
|---|---|---|
| Cada minuto | * * * * * | Se ejecuta al inicio de cada minuto |
| Cada 5 minutos | */5 * * * * | Minutos 0, 5, 10, 15, …, 55 |
| Cada 15 minutos | */15 * * * * | Minutos 0, 15, 30, 45 |
| Cada hora | 0 * * * * | En el minuto 0 de cada hora |
| Cada 6 horas | 0 */6 * * * | A las 00:00, 06:00, 12:00, 18:00 |
| Diariamente a medianoche | 0 0 * * * | Una vez al día a las 00:00 |
| Diariamente a las 3 AM | 0 3 * * * | Una vez al día a las 03:00 |
| Cada lunes a las 9 AM | 0 9 * * 1 | Semanalmente el lunes a las 09:00 |
| Cada día laborable a las 8 AM | 0 8 * * 1-5 | Lunes a viernes a las 08:00 |
| Cada fin de semana al mediodía | 0 12 * * 0,6 | Sábado y domingo a las 12:00 |
| Primero de cada mes | 0 0 1 * * | Medianoche del 1 de cada mes |
| Cada trimestre (Ene, Abr, Jul, Oct) | 0 0 1 1,4,7,10 * | Medianoche del 1 de meses trimestrales |
| Cada 15 min en horario laboral | */15 9-17 * * 1-5 | Días laborables, 9 AM–5 PM, cada 15 min |
Pega cualquier expresión en el Constructor de Expresiones Cron para visualizar los próximos tiempos de ejecución.
Patrones Avanzados
Combinando Listas y Rangos
Los campos aceptan sintaxis mixta. Para ejecutar una tarea a las 8 AM y 6 PM en días laborables:
0 8,18 * * 1-5
Para apuntar a meses específicos con un paso:
0 0 1 1-12/3 * # Cada 3 meses comenzando en enero (Ene, Abr, Jul, Oct)
Día del Mes vs. Día de la Semana
Cuando tanto el día del mes como el día de la semana están establecidos (no *), el comportamiento depende de la implementación. En cron estándar, la tarea se ejecuta si cualquiera de las condiciones se cumple — es una relación OR, no AND. Esto sorprende a muchas personas.
0 0 15 * 1 # Se ejecuta el 15 Y cada lunes — no "el lunes 15"
Ejecución al Arranque
Aunque no es una expresión cron propiamente, @reboot es un atajo ampliamente soportado:
@reboot /usr/local/bin/start-service.sh
Otros atajos comunes:
| Atajo | Equivalente |
|---|---|
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
Cron en Diferentes Entornos
La sintaxis de cinco campos es universal, pero cómo configuras cron varía según la plataforma.
Crontab de Linux
El clásico. Edita tu crontab de usuario con crontab -e:
# Ejecutar copia de seguridad todos los días a las 2 AM
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
Las tareas cron del sistema en /etc/cron.d/ incluyen un campo extra de usuario:
0 2 * * * root /usr/local/bin/cleanup.sh
GitHub Actions
GitHub Actions usa la misma sintaxis de cinco campos dentro de un trigger schedule. Todos los tiempos son UTC.
on:
schedule:
- cron: '0 3 * * 1-5' # Días laborables a las 3 AM UTC
Para una inmersión profunda en la configuración YAML, consulta YAML para Kubernetes y YAML para Docker Compose.
Kubernetes CronJob
Kubernetes envuelve las expresiones cron en un recurso CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: reporting:latest
command: ["python", "generate_report.py"]
restartPolicy: OnFailure
Kubernetes usa UTC por defecto. A partir de la v1.25, puedes establecer timeZone: "America/New_York" en la especificación del CronJob.
AWS CloudWatch (EventBridge)
AWS usa una sintaxis ligeramente diferente con seis campos (añadiendo segundos) y los envolventes rate() / cron():
cron(0 3 * * ? *) # Diariamente a las 3 AM UTC
Nota el carácter ? — AWS lo requiere para el día del mes o el día de la semana cuando el otro está especificado. Esto es diferente del cron estándar.
Errores Comunes
1. Confusión de Zona Horaria
Cron usa la zona horaria del sistema en Linux, pero Kubernetes y GitHub Actions se ejecutan en UTC. Una tarea programada para 0 9 * * * se ejecutará a las 9 AM UTC, que es las 4 AM hora del Este o la 1 AM hora del Pacífico.
Siempre verifica qué zona horaria usa tu programador. Para conversiones de marcas de tiempo, nuestra guía de Marca de Tiempo Unix Explicada cubre los desfases UTC en detalle.
2. Ejecuciones Superpuestas
Si una tarea tarda más que el intervalo entre ejecuciones, obtendrás instancias superpuestas. Un script que se ejecuta durante 8 minutos en un horario */5 * * * * se acumulará.
Soluciones:
- Usa un archivo de bloqueo (
flocken Linux) - Establece
concurrencyPolicy: Forbiden los CronJobs de Kubernetes - Verifica instancias en ejecución al inicio de tu script
3. Salida Faltante y Depuración
Cron no captura stdout por defecto. Siempre redirige la salida:
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
Si una tarea cron no se ejecuta, verifica:
grep CRON /var/log/syslogpara logs de ejecución- Permisos de archivo del script
- La variable de entorno
PATH— cron tiene unPATHmínimo por defecto
4. La Trampa del "31 de Cada Mes"
0 0 31 * * # Solo se ejecuta en meses con 31 días
Esto se ejecuta en enero, marzo, mayo, julio, agosto, octubre y diciembre — pero omite silenciosamente los otros cinco meses. Si necesitas una tarea de fin de mes, considera ejecutarla el 1 y ajustar la lógica de tu script, o usa una herramienta que soporte semánticas de "último día del mes".
5. Olvidar la Nueva Línea al Final del Crontab
Algunas implementaciones de cron requieren una nueva línea al final del archivo crontab. Si tu última entrada no se ejecuta, añade una línea vacía al final.
Construyendo Expresiones Visualmente
Memorizar la sintaxis funciona para patrones comunes, pero los horarios complejos son más fáciles de construir visualmente. El Constructor de Expresiones Cron en alltools.one te permite:
- Seleccionar valores para cada campo usando desplegables
- Ver una descripción legible del horario
- Previsualizar los próximos tiempos de ejecución
- Copiar la expresión final con un clic
Se ejecuta completamente en tu navegador — no se envían datos a ningún servidor.
Tarjeta de Referencia Rápida
Copia este bloque en la documentación de tu proyecto o wiki del equipo:
# ┌───── min (0-59)
# │ ┌───── hora (0-23)
# │ │ ┌───── día del mes (1-31)
# │ │ │ ┌───── mes (1-12)
# │ │ │ │ ┌───── día de la semana (0-7, Dom=0 o 7)
# │ │ │ │ │
# * * * * *
*/5 * * * * # Cada 5 minutos
0 * * * * # Cada hora
0 0 * * * # Diariamente a medianoche
0 9 * * 1-5 # Días laborables a las 9 AM
0 0 1 * * # Primero del mes
*/15 9-17 * * 1-5 # Cada 15 min, horario laboral
Lectura Adicional
- Marca de Tiempo Unix Explicada — Entiende el tiempo epoch y las conversiones de zona horaria
- YAML para Kubernetes — Configura CronJobs y otros recursos de Kubernetes
- YAML para Docker Compose — Programa contenedores en configuraciones compose
¿Listo para construir tu próxima expresión cron? Abre el Constructor de Expresiones Cron y programa correctamente desde la primera vez.