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 (
*/15o9-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:
| Macro | Equivale a | Significado |
|---|---|---|
@yearly / @annually | 0 0 1 1 * | Una vez al año, el 1 de enero a medianoche |
@monthly | 0 0 1 * * | Una vez al mes, el día 1 a medianoche |
@weekly | 0 0 * * 0 | Una vez a la semana, el domingo a medianoche |
@daily / @midnight | 0 0 * * * | Una vez al día, a medianoche |
@hourly | 0 * * * * | 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.