Saltar al contenido
LeedyBox
Apoyar

Cómo leer expresiones cron

Una expresión cron describe una programación periódica en unos pocos campos separados por espacios. La idea es sencilla, pero el orden de los campos y los caracteres especiales difieren entre sistemas. Esta guía muestra cómo leer los formatos habituales.

Los cinco campos de Unix

El cron clásico de Unix y Linux usa cinco campos, que se leen de izquierda a derecha:

minuto hora día-del-mes mes día-de-la-semana

Así, 30 9 * * 1-5 significa «a las 09:30, de lunes a viernes». Los minutos van de 0 a 59, las horas de 0 a 23, los días del mes de 1 a 31 y los meses de 1 a 12. El día de la semana va de 0 a 6, donde 0 es el domingo (muchas implementaciones también aceptan 7 para el domingo). La mayoría de las versiones aceptan además nombres como JAN o MON y macros como @daily o @hourly.

Formatos Spring, Quartz y AWS

Otros programadores de tareas añaden campos, y esa es la causa más habitual de confusión al copiar una expresión de un sistema a otro.

FormatoCamposDía de la semana
Unix / Linux5: minuto hora día mes día-de-la-semana0–6, domingo = 0
Spring6: segundo minuto hora día mes día-de-la-semana0–7, domingo = 0 o 7
Quartz6 o 7: segundo minuto hora día mes día-de-la-semana [año]1–7, domingo = 1
AWS EventBridge6: minuto hora día mes día-de-la-semana año1–7, domingo = 1

Las mismas cifras pueden significar cosas distintas: 0 0 12 * * ? es «todos los días a mediodía» en Quartz, mientras que leído con 5 campos no sería válido. Los números de los días de la semana también se desplazan: en Quartz y AWS, 2 es el lunes, pero en el cron de Unix es el martes. Los nombres de los días, como MON, evitan esta ambigüedad donde se admiten.

Caracteres especiales

  • * todos los valores del campo.
  • , una lista, p. ej. 1,15.
  • - un rango, p. ej. 9-17 o MON-FRI.
  • / un paso: */15 en el campo de minutos significa cada 15 minutos; 5/15 empieza en 5 (no lo admite el cron clásico de Unix, donde se usa un rango como 5-59/15).
  • ? «sin valor concreto»; Quartz y AWS lo exigen en el día del mes o en el día de la semana.
  • L último: L en el día del mes es el último día del mes; en Quartz, 6L en el día de la semana es el último viernes.
  • W día laborable más cercano: 15W es el día laborable más próximo al día 15.
  • # n-ésimo día de la semana del mes: 6#3 es el tercer viernes en la numeración de Quartz y AWS.

L, W y # son extensiones que el cron clásico de Unix no admite.

Día del mes frente a día de la semana

Cuando se restringen los dos campos de día, los sistemas no coinciden en cómo combinarlos. En el cron clásico de Unix, la tarea se ejecuta cuando coincide cualquiera de los dos campos: 0 9 13 * 5 se ejecuta el día 13 de cada mes y todos los viernes, no solo los viernes 13. Spring exige que coincidan ambos. Quartz y AWS evitan la cuestión exigiendo ? en uno de los dos campos.

El Analizador cron de LeedyBox aplica la regla del formato que elijas y explica en su resumen si basta con que coincida uno de los dos días o deben coincidir ambos.

Zonas horarias y horario de verano

Una expresión cron no incluye zona horaria. Se ejecuta en la zona horaria del sistema o servicio que la ejecuta, que puede ser la hora local del servidor o UTC. Una tarea pensada para las 09:00 hora local puede ejecutarse a otra hora si el servidor usa UTC.

El horario de verano añade más casos límite. Cuando se adelantan los relojes, una hora como las 02:30 puede no existir ese día; cuando se atrasan, puede darse dos veces. Según la implementación, una tarea en ese intervalo puede omitirse, ejecutarse con retraso o ejecutarse dos veces. Programar las tareas importantes fuera del intervalo del cambio, o en UTC, reduce las sorpresas. El Analizador cron te permite elegir una zona horaria y lista las próximas ejecuciones para que puedas comprobar las fechas cercanas a un cambio.

Preguntas frecuentes

¿Cómo ejecuto una tarea cada 5 minutos?

En el cron de Unix, usa */5 * * * *. En Spring, añade un campo de segundos al principio: 0 */5 * * * *.

¿Por qué mi expresión de Quartz falla en el crontab de Linux?

Las expresiones de Quartz empiezan con un campo de segundos y pueden usar ? o L, que crontab no acepta. Reescribe la expresión en el formato de 5 campos.

¿Son exactas las próximas ejecuciones que muestra el analizador?

Se calculan en tu navegador para el formato y la zona horaria seleccionados. Confirma la programación en el sistema que ejecutará la tarea, ya que las implementaciones pueden diferir.