Ingeniería · 24 de agosto de 2026

Referencia de expresiones cron — todos los ejemplos que realmente necesitarás

Cada minuto, cada día laborable a las 9am, primero del mes, último viernes — expresiones cron copiar-pegar con explicaciones de qué hace cada campo.

Una expresión cron es la forma más concisa de decirle a una computadora “ejecuta esto en esta programación”. Cinco campos, todos números y caracteres especiales, sin ambigüedad una vez que aprendes la sintaxis. El problema: hay aproximadamente quince patrones comunes que realmente necesitas, y el resto del tiempo estás mirando un prompt de crontab -e tratando de recordar si domingo es 0 o 7.

Esta publicación es la referencia que desearía haber tenido hace cinco años. Cada patrón común, con una expresión copiar-pegar, una explicación y una nota sobre la trampa que atrapa a la gente.

Los cinco campos

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

Cada campo puede ser:

  • Un valor específico: 5
  • Un comodín: * (cada valor)
  • Un rango: 1-5
  • Un paso: */15 (cada 15)
  • Una lista: 1,15,30
  • Un rango con paso: 1-30/5 (cada 5 entre 1 y 30)

Eso es todo. El resto es combinar estos primitivos.

Los patrones

Cada minuto

* * * * *

Caso de uso: un trabajo que siempre debería estar ejecutándose y el programador simplemente lo reinicia. Rara vez es lo que quieres.

Cada N minutos

*/5 * * * *      # cada 5 minutos
*/15 * * * *     # cada 15 minutos
*/30 * * * *     # cada 30 minutos

El */5 significa “comenzando en 0, cada 5 minutos”. Entonces 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55.

Trampa: la primera ejecución de */5 es en el minuto 0, no en el momento en que guardaste el crontab. Si lo guardas a las 12:03, la primera ejecución es a las 12:05, no a las 12:08.

Cada hora en punto

0 * * * *

Trampa: esto es “minuto 0 de cada hora”, que es 1:00, 2:00, 3:00, etc. Si quieres “cada hora, 30 minutos después”, usa 30 * * * *.

Cada día a medianoche

0 0 * * *

Trampa: la zona horaria del servidor. cron usa la zona horaria del sistema. Si tu servidor está en UTC y quieres medianoche en la hora del Este de EE.UU., necesitas convertir. La solución más limpia: configura la zona horaria del sistema a la que quieras, o establece la variable de entorno CRON_TZ (soportada por la mayoría de las implementaciones modernas de cron).

Cada día a una hora específica

0 9 * * *       # 9:00 AM
30 14 * * *     # 2:30 PM
0 0 * * *       # medianoche
15 3 * * *      # 3:15 AM

Cada día laborable a las 9 AM

0 9 * * 1-5

El 1-5 es el día de la semana, de lunes a viernes.

Trampa: 0 y 7 significan domingo. La especificación POSIX acepta ambas. La mayoría de las implementaciones son tolerantes si accidentalmente usas 7. No confíes en eso.

Cada lunes

0 0 * * 1

Medianoche todos los lunes.

Dos veces por semana (lunes y jueves)

0 9 * * 1,4

9 AM los lunes y jueves.

Primero de cada mes

0 0 1 * *

Medianoche el día 1.

Último día del mes

0 0 L * *

El L es una extensión de Vixie cron / Quartz. El cron estándar no lo tiene. Si estás usando cron estándar, estás atrapado con aproximaciones de “último día” como 0 0 28-31 * * (que se ejecuta el 28, 29, 30 y 31, y el 28 de febrero).

Cada trimestre

0 0 1 */3 *

Medianoche el día 1 de enero, abril, julio y octubre.

Cada domingo al mediodía

0 12 * * 0

Cada 6 horas

0 */6 * * *

0:00, 6:00, 12:00, 18:00.

Cada minuto entre las 9 AM y las 5 PM, días laborables

* 9-17 * * 1-5

Un trabajo que se ejecuta cada minuto de 9:00:00 a 17:59:59, de lunes a viernes. Probablemente demasiado agresivo — pero posible.

A las 2:30 AM el primero de cada mes

30 2 1 * *

A las 11 PM el último viernes del mes

0 23 * * 5#5

El 5#5 es “quinto viernes del mes” (sintaxis Quartz). El # y L son extensiones no estándar — el cron estándar no tiene una expresión de “último viernes del mes”. Si necesitas esto en cron estándar, necesitas un script auxiliar que verifique la fecha.

Cada 30 segundos

El cron estándar no baja de 1 minuto. Para programación sub-minuto:

  • systemd timers: OnUnitActiveSec=30s
  • En Kubernetes CronJob: no es posible (mínimo 1 minuto). Usa un Job regular con sleep 30 en un bucle.
  • En una aplicación Node.js: setInterval(fn, 30_000) dentro del proceso.

Horario de verano

cron maneja el horario de verano ejecutando el trabajo dos veces (adelantando) o saltándolo (retrasando), dependiendo de la implementación. Si tu trabajo es sensible al tiempo (una facturación, un informe), prográmalo bien fuera de la ventana de 1-3 AM para evitar sorpresas del horario de verano.

El programador Quartz maneja esto con la bandera DST. El cron estándar no.

El límite de granularidad de 1 minuto

cron es fundamentalmente una herramienta con resolución de 1 minuto. Si necesitas programación sub-minuto, la respuesta es “usa una herramienta diferente”. Para Kubernetes específicamente:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-30-seconds
spec:
  schedule: "* * * * *"
  startingDeadlineSeconds: 10
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: worker
              image: myworker:latest
              command: ["/bin/sh", "-c", "for i in 1 2; do do_work; sleep 30; done"]

Esto ejecuta el trabajo cada 30 segundos emitiendo dos sub-trabajos por minuto. Rudo, pero funciona.

¿Qué pasa con Quarkus, EventBridge, Kubernetes CronJob?

Los diferentes programadores usan sintaxis cron ligeramente diferentes. La forma de cinco campos es la más común. Algunos otros:

  • Quartz: seis campos (con segundos) y el comodín ? para “sin valor específico”.
  • AWS EventBridge: seis campos, soporta las extensiones L y #.
  • Kubernetes CronJob: cinco campos, sin soporte de L o #.
  • Spring @Scheduled: seis campos (con segundos), soporte de ? y L.
  • GitHub Actions: cinco campos, sin extensiones.

Si estás usando una herramienta que no coincide con el estándar, consulta la documentación. La mayoría de los patrones de esta referencia se transfieren directamente. Las extensiones no estándar (L, #, W) no.

Generar expresiones cron sin memorizar sintaxis

Si no quieres memorizar la sintaxis, el generador de cron en DevSpeedTools te permite hacer clic a través de los cinco campos y muestra las próximas cinco ejecuciones programadas. Es la forma más rápida de verificar “¿0 9 * * 1-5 realmente significa 9 AM días laborables?” — la respuesta es sí, pero ver las fechas de próxima ejecución hace que el patrón sea concreto.

Para expresiones puntuales, crontab.guru es la referencia estándar. El generador de cron hace el mismo trabajo y es completamente del lado del cliente, por lo que las expresiones que pegas nunca salen de tu navegador.

El resumen

Las expresiones cron son un DSL pequeño con algunas reglas. Aprende los cinco campos, aprende * (cualquiera), - (rango), / (paso) y , (lista), y puedes expresar el 95% de las programaciones que alguna vez necesitarás. El otro 5% necesita extensiones específicas del programador o una herramienta diferente. En caso de duda, genera y previsualiza la expresión con una herramienta que muestre las próximas ejecuciones — mucho más rápido que depurar mentalmente.