Toolbit

Explicador de expresiones cron

Traduce una expresión cron a lenguaje simple y muestra sus próximas ejecuciones.

Cinco campos, un horario

cron es el demonio estándar de Unix/Linux para programar tareas repetitivas, y una expresión cron es la forma de decirle exactamente cuándo correr un comando: cinco campos separados por espacios, en este orden: minuto, hora, día del mes, mes y día de la semana.

┌───────────── 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 son domingo)
│ │ │ │ │
* * * * *

Cada campo admite varias notaciones, que pueden combinarse con comas para armar casi cualquier programación:

  • * — cualquier valor, sin restricción.
  • Un valor puntual (5) — coincide solo con ese número.
  • Un rango (9-17) — cualquier valor dentro del rango, ambos extremos incluidos.
  • Una lista (1,15,30) — cualquiera de los valores enumerados.
  • Un paso (*/15 o 9-17/2) — valores espaciados por ese intervalo, dentro del rango o de todo el campo si es *.

Por ejemplo, 0,30 9-17 * * 1-5 corre en el minuto 0 y el 30 de cada hora entre las 9 y las 17, de lunes a viernes.

El error más común: día del mes y día de la semana a la vez

La confusión más frecuente aparece cuando día del mes y día de la semana están restringidos al mismo tiempo (ninguno de los dos es *). Lo intuitivo sería esperar que ambas condiciones se combinen con "y", pero el estándar POSIX de cron las combina con "o".

Tomemos 0 0 15 * 1 (medianoche del 15, o lunes): no significa "el 15 solo si es lunes". Significa que corre a medianoche todos los días 15 (sea cual sea el día de la semana que le toque) y además todos los lunes a medianoche (sea cual sea la fecha). Si el 15 cae martes, de todas formas corre ese día por la regla del día del mes, y también corre el lunes más cercano por la regla del día de la semana.

Esta regla de "o" aplica únicamente cuando los dos campos están restringidos a la vez. Si uno de ellos es * — por ejemplo 0 0 * * 1, "todos los lunes" — el comportamiento vuelve a ser el esperable: solo importa la condición que sí está restringida.

Sobre la zona horaria

cron ejecuta las tareas según la zona horaria configurada en el sistema donde corre (o la variable CRON_TZ, en las implementaciones que la soportan), no necesariamente en UTC. Esta herramienta calcula las próximas ejecuciones tomando como referencia la zona horaria del navegador de quien la usa — para saber en qué zona horaria corre realmente un cron en producción hay que revisar la configuración del servidor donde está programado.

Macros habituales

Varias implementaciones de cron, incluyendo el crontab de Linux, aceptan atajos con @ en vez de escribir los cinco campos:

MacroEquivale aSignificado
@yearly / @annually0 0 1 1 *Una vez al año, el 1 de enero a medianoche
@monthly0 0 1 * *Una vez al mes, el día 1 a medianoche
@weekly0 0 * * 0Una vez a la semana, el domingo a medianoche
@daily / @midnight0 0 * * *Una vez al día, a medianoche
@hourly0 * * * *Una vez por hora, en el minuto 0

Cómo usar esta herramienta

Escribe una expresión de 5 campos (o una macro como @daily) y la herramienta la traduce campo por campo a una descripción en palabras simples, además de calcular las próximas 5 fechas y horas de ejecución a partir de este momento. Cuando día del mes y día de la semana quedan restringidos a la vez, se muestra una nota aclarando la regla de "o" para que el resultado no tome por sorpresa.

Preguntas frecuentes

¿Por qué el 15 del mes y "lunes" a la vez ejecutan más seguido de lo que parece?

Porque cuando tanto el día del mes como el día de la semana están restringidos (no son "*"), cron los combina con "o", no con "y": se ejecuta el día 15 sea cual sea el día de la semana, y también todos los lunes sean cuales sean del mes.

¿Qué significa el asterisco (*) en un campo?

Significa "cualquier valor válido" para ese campo: no restringe nada. Por eso una expresión con los 5 campos en "*" ("* * * * *") se ejecuta todos los minutos, sin excepción.

¿Qué son las macros como @daily o @hourly?

Son atajos que reemplazan expresiones cron comunes: @daily equivale a "0 0 * * *" (todos los días a medianoche), @hourly a "0 * * * *" (al comienzo de cada hora), y así con @weekly, @monthly y @yearly.