Las expresiones cron parecen crípticas a primera vista: cinco campos separados por espacios llenos de asteriscos, números, barras y comas. Pero hay una lógica consistente en cada campo y, una vez que la entiendes, leer y escribir programaciones cron se vuelve sencillo. Esta guía desglosa cada parte de la sintaxis cron, explica los caracteres especiales, muestra los patrones de programación más comunes y cubre las herramientas que resuelven, validan y simulan expresiones cron antes de desplegarlas.
¿Qué es una expresión cron?
Una expresión cron es una cadena de cinco (o a veces seis) campos separados por espacios que define una programación recurrente para tareas automatizadas. El formato se inventó con el demonio cron de Unix a principios de los años 70 y se ha mantenido esencialmente sin cambios desde entonces. Hoy se usa en archivos crontab de Linux, en pipelines de CI/CD como GitHub Actions y GitLab CI, en programadores en la nube como AWS EventBridge y Google Cloud Scheduler, en orquestadores de contenedores como Kubernetes CronJob y en frameworks de aplicaciones como Spring y Quartz.
La anatomía de una expresión cron
El formato estándar de cinco campos es:
┌----------- minuto (0-59)
│ ┌--------- hora (0-23)
│ │ ┌------- día del mes (1-31)
│ │ │ ┌----- mes (1-12)
│ │ │ │ ┌--- día de la semana (0-7, domingo = 0 o 7)
│ │ │ │ │
* * * * * comando a ejecutarLos campos se leen de izquierda a derecha: minuto, hora, día del mes, mes, día de la semana. La expresión "0 9 * * 1-5" se ejecuta a las 09:00 cada día laborable. Cada campo puede contener un valor único, una lista separada por comas, un rango, un paso, un comodín o una combinación. Entender estos operadores es toda la habilidad de leer cron.
Note
Sintaxis de la expresión cron campo por campo
Cada campo tiene un rango definido de valores enteros válidos. Los valores fuera del rango válido producen un error o una mala configuración silenciosa según la implementación de cron. Entender el rango válido de cada campo es la base para leer cualquier expresión cron.
Rangos válidos de cada campo
- Minuto - de 0 a 59. El valor 0 es el inicio de la hora; el valor 59 es un minuto antes de la siguiente hora.
- Hora - de 0 a 23. Usa formato de 24 horas: 0 es medianoche, 12 es mediodía, 23 son las 11 PM.
- Día del mes - de 1 a 31. Los días se indexan desde 1. Algunos meses tienen menos días: febrero tiene 28 o 29, y abril/junio/septiembre/noviembre tienen 30.
- Mes - de 1 a 12. Enero es 1, diciembre es 12. Algunas implementaciones también aceptan abreviaturas de tres letras: JAN, FEB, MAR, etc.
- Día de la semana - de 0 a 7. Tanto 0 como 7 representan el domingo. El lunes es 1, el sábado es 6. Algunas implementaciones admiten MON, TUE, WED, THU, FRI, SAT, SUN.
Cómo interactúan los campos
Los cinco campos se evalúan juntos como un AND lógico: el trabajo se ejecuta cuando todos los campos sin comodín coinciden simultáneamente. "0 9 15 * *" se ejecuta exactamente a las 09:00 el día 15 de cada mes. La excepción crítica es cuando tanto el día del mes como el día de la semana tienen valores sin comodín: en ese caso, la mayoría de demonios cron se ejecutan si CUALQUIERA de las condiciones es verdadera (un OR lógico), no ambas. Esta es una fuente notoria de comportamientos inesperados.
Warning
Caracteres especiales explicados
El poder de cron proviene de sus caracteres especiales: los operadores que convierten valores fijos en patrones de programación flexibles. Dominar estos seis operadores cubre prácticamente todos los patrones de programación que encontrarás.
Los seis operadores básicos
| Carácter | Nombre | Ejemplo | Significado |
|---|---|---|---|
| * | Comodín | * en minuto | Todos los valores válidos (0-59 para minutos) |
| , | Lista | 1,15,30 en minuto | En los minutos 1, 15 y 30 |
| - | Rango | 1-5 en día de la semana | De lunes a viernes (días 1 a 5) |
| / | Paso | */15 en minuto | Cada 15 minutos (0, 15, 30, 45) |
| ? | Sin especificar | ? en día del mes | Sin valor específico (solo Quartz/Spring) |
| @ | Macro | @daily | Alias abreviados (@daily = 0 0 * * *) |
Combinar operadores
Los operadores se pueden combinar dentro de un mismo campo. "0,30 9-17 * * 1-5" significa "en los minutos 0 y 30 de cada hora de 9 AM a 5 PM, de lunes a viernes". La sintaxis de paso también puede aplicarse a un rango: "0-30/5" en el campo de minuto significa cada 5 minutos desde el minuto 0 hasta el 30 (0, 5, 10, 15, 20, 25, 30). El Traductor de Cron a Lenguaje Humano desglosa cualquier combinación en lenguaje claro con explicaciones campo por campo.
Tip
Patrones de programación cron comunes
La mayoría de las programaciones cron del mundo real caen en un puñado de patrones recurrentes. Conocer estos patrones de vista te permite leer la mayoría de crontabs de producción sin referencia.
- "* * * * *" - Cada minuto. La programación más frecuente posible. Se usa para comprobaciones de latido y monitoreo.
- "*/5 * * * *" - Cada 5 minutos. Común para trabajos de sondeo y calentamiento de caché.
- "0 * * * *" - Cada hora en punto. Estándar para procesos por lotes horarios.
- "0 0 * * *" - Diariamente a medianoche (UTC). El valor por defecto para trabajos de limpieza diaria.
- "0 9 * * 1-5" - 9 AM cada día laborable. Programación estándar en horario laboral.
- "0 0 1 * *" - Medianoche el día 1 de cada mes. Ejecuciones de facturación mensual, generación de informes.
- "0 0 1 1 *" - Medianoche el 1 de enero. Trabajos anuales: renovaciones de licencias, informes de fin de año.
- "0 0 * * 0" - Medianoche cada domingo. Ventanas de mantenimiento semanales.
Construir programaciones personalizadas a partir de patrones
La mayoría de las programaciones complejas son combinaciones de estos patrones. "0 2 * * 6,0" significa "2 AM los sábados y domingos": la ventana de mantenimiento del fin de semana. "*/10 8-18 * * 1-5" significa "cada 10 minutos de 8 AM a 6 PM, solo días laborables". Si conoces la programación objetivo en lenguaje claro, el Crontab Expression Builder te permite configurar cada campo visualmente y genera la expresión correcta con una confirmación legible y las próximas cinco ejecuciones.
Crontab Expression Builder
Crea expresiones cron visualmente con 15 preajustes, 5 modos de campo, descripción instantánea en lenguaje claro y vista previa de las próximas 5 ejecuciones: gratis, sin registro.
Cómo crear y validar expresiones cron
Escribir una expresión cron desde cero y esperar que sea correcta es arriesgado. Un solo campo transpuesto o un operador mal entendido puede hacer que un trabajo se ejecute a horas completamente equivocadas, o que nunca se ejecute. Estas herramientas eliminan ese riesgo.
Escribe o selecciona tu expresión
Abre el Crontab Expression Builder y escribe tu expresión directamente o elige entre los 15 preajustes integrados. Cada preajuste cubre un patrón de programación común (cada minuto, horario, diario, días laborables, mensual) y puede ajustarse con los controles visuales de campo sin tocar la expresión en bruto.
Valida los errores de sintaxis
Pega la expresión en el Validador de Expresiones Cron. Comprueba cada campo contra su rango válido, valida los límites de los rangos (el inicio debe ser menor que el fin), confirma que los valores de paso no son cero y marca las macros no compatibles con el crontab estándar de 5 campos. Cada error incluye un mensaje a nivel de línea que explica qué esperaba el analizador.
Traduce a lenguaje claro
Pasa la expresión validada por el Traductor de Cron a Lenguaje Humano. La salida es una frase completa en lenguaje claro que describe la programación - "A las 2:30 AM, los lunes, miércoles y viernes" - más un desglose campo por campo. Si la descripción no coincide con tu intención, revisa la expresión antes de desplegar.
Simula las próximas 12 meses de ejecuciones
Para trabajos programados donde el momento importa - ejecuciones de facturación, exportaciones de datos, ventanas de mantenimiento - abre el Interactive Cron Scheduler y simula la expresión durante los próximos 12 meses. La vista de calendario muestra la densidad mensual de ejecuciones y la línea de tiempo muestra las marcas de tiempo exactas. Confirma que la programación se ejecuta en las fechas esperadas antes de fusionar la configuración a producción.
Validador de Expresiones Cron
Valida sintaxis cron de 5 campos, rangos, pasos, valores de lista y macros con diagnósticos instantáneos por campo: local en el navegador, gratis, sin registro.
Cron en CI/CD y programadores en la nube
La sintaxis cron se usa mucho más allá del crontab de Linux. Las plataformas modernas de CI/CD y nube han adoptado el mismo formato de 5 campos, pero cada una tiene sus peculiaridades en el manejo de zonas horarias, soporte de macros y restricciones de intervalo mínimo.
Diferencias plataforma por plataforma
| Plataforma | Campos | Zona horaria | Macros | Intervalo mínimo |
|---|---|---|---|---|
| Linux crontab | 5 | Local del sistema | ✓ Las 6 | Cada minuto |
| GitHub Actions | 5 | Solo UTC | ✗ Ninguna | Cada 5 min (deriva forzada de 15 min) |
| GitLab CI | 5 | Solo UTC | ✓ Parcial | Cada minuto |
| AWS EventBridge | 5 o 6 | Solo UTC | ✗ Ninguna | Cada minuto |
| Google Cloud Scheduler | 5 o unix | Cualquier zona IANA | ✓ Algunas | Cada minuto |
| Kubernetes CronJob | 5 | Zona del clúster | ✗ Ninguna | Cada minuto |
| Spring Scheduler | 6 | Por defecto de la JVM | ✓ Sí | Cada segundo |
Programación cron en GitHub Actions
GitHub Actions usa la sintaxis cron estándar de 5 campos pero siempre se ejecuta en UTC. Si quieres un trabajo a las 9 AM hora del Este (UTC-5), escribes "0 14 * * *". GitHub Actions tampoco admite sintaxis de macros (@daily, @weekly), así que usa la expresión completa. Los flujos programados durante periodos de alta carga pueden ejecutarse hasta 15 minutos tarde: diseña tus trabajos para tolerar esta deriva.
Convertir cron a temporizadores systemd
Los sistemas Linux modernos usan cada vez más temporizadores systemd en lugar del crontab clásico. El formato OnCalendar de systemd usa una sintaxis diferente pero cubre los mismos patrones. El Convertidor de Cron a Temporizador Systemd convierte cualquier expresión cron de 5 campos a su configuración equivalente de unidad de temporizador systemd, incluyendo una plantilla completa de archivos .timer y .service.
Errores y casos límite de cron
Incluso los desarrolladores experimentados encuentran fallos silenciosos con cron. Estos son los errores más comunes: cada uno ha costado a sistemas de producción tiempo de inactividad inadvertido o ejecuciones duplicadas de trabajos.
Sorpresas de zona horaria
Cron se ejecuta por defecto en la zona horaria local del servidor. Si tu servidor está en UTC pero tu negocio está en Nueva York (UTC-5), "0 9 * * *" se ejecuta a las 4 AM hora local, no a las 9 AM. Las plataformas en la nube como GitHub Actions y AWS EventBridge siempre se ejecutan en UTC, lo que significa que todo el cálculo de zonas horarias recae en ti. Confirma siempre la zona horaria antes de desplegar una programación. El Interactive Cron Scheduler te permite simular ejecuciones con el desfase horario aplicado.
Casos límite de fin de mes
Programar un trabajo el día 29, 30 o 31 del mes hace que omita silenciosamente los meses que no tienen esa fecha. "0 0 31 * *" nunca se ejecuta en abril, junio, septiembre o noviembre. "0 0 29 2 *" se ejecuta en febrero solo en años bisiestos. Si necesitas una programación de "último día del mes", necesitas un enfoque más inteligente: o ejecutar a diario con un script que compruebe la fecha, o usar un programador en la nube que admita la sintaxis L (último) día.
Transiciones de horario de verano
Las transiciones del horario de verano pueden hacer que los trabajos cron se ejecuten dos veces o se omitan. Cuando los relojes adelantan, las horas dentro de la hora saltada nunca ocurren. Cuando los relojes atrasan, las horas dentro de la hora repetida ocurren dos veces. Los trabajos programados en una zona horaria local durante la ventana de transición se ven afectados. La práctica más segura es ejecutar servidores y programadores en UTC, que nunca tiene transiciones de horario de verano.
Warning
El problema de cada segundo
El cron estándar de 5 campos tiene una resolución mínima de un minuto. Si necesitas que un trabajo se ejecute cada 10 segundos, cron no es la herramienta adecuada: usa un temporizador del sistema, una cola de trabajos con retardos o el campo de segundos disponible en Spring Scheduler y Quartz. Intentar aproximar programaciones de menos de un minuto con múltiples entradas de crontab es propenso a errores y crea condiciones de carrera cuando los trabajos se solapan.
Key takeaways
- Una expresión cron tiene cinco campos: minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12), día de la semana (0-7).
- Los seis caracteres especiales son * (comodín), , (lista), - (rango), / (paso), ? (sin especificar, solo Quartz) y @ (macros como @daily).
- Cuando tanto el día del mes como el día de la semana son valores sin comodín, la mayoría de demonios cron se ejecutan si CUALQUIERA coincide - una fuente común de dobles ejecuciones inesperadas.
- Usa el Crontab Expression Builder para construir visualmente, el Validador de Expresiones Cron para comprobar la sintaxis y el Interactive Cron Scheduler para simular 12 meses de ejecuciones.
- GitHub Actions usa cron de 5 campos solo UTC sin soporte de macros; AWS EventBridge y Google Cloud Scheduler también usan UTC; el crontab de Linux usa la zona horaria local del sistema.
- No programes el día 29, 30 o 31 si necesitas que el trabajo se ejecute cada mes - esos días no existen en todos los meses.
- El cron estándar tiene una resolución mínima de un minuto; usa temporizadores systemd, colas de trabajos o Spring/Quartz para necesidades de programación de menos de un minuto.