¿Qué es una expresión cron?
Una expresión cron es la forma estándar de programar tareas repetitivas en sistemas Unix/Linux: le dice al demonio cron exactamente cuándo ejecutar un comando, usando cinco campos separados por espacios que representan, en 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 acepta varias formas de notación:
*— cualquier valor, sin restricción.- Un valor específico (
5) — coincide únicamente con ese valor. - Un rango (
9-17) — cualquier valor dentro del rango, inclusive. - Una lista (
1,15,30) — cualquiera de los valores enumerados. - Un paso (
*/15o9-17/2) — valores separados por ese intervalo dentro del rango (o de todo el campo, si es*).
Combinando estas notaciones con comas se puede expresar casi cualquier programación: 0,30 9-17 * * 1-5 se ejecuta en el minuto 0 y el 30 de cada hora entre las 9 y las 17, de lunes a viernes.
La trampa más común: día del mes y día de la semana
La confusión más frecuente al leer una expresión cron aparece cuando tanto el día del mes como el día de la semana están restringidos (ninguno de los dos es *). La expectativa intuitiva sería que ambas condiciones se combinan con "y" (que coincidan las dos a la vez), pero el estándar POSIX de cron las combina con "o".
Por ejemplo, 0 0 15 * 1 (medianoche del día 15 del mes, o lunes) no significa "el día 15 solo si cae lunes". Significa: se ejecuta a medianoche todos los días 15 del mes (sea cual sea el día de la semana que le toque) y además todos los lunes a medianoche (sea cual sea el día del mes). Si el día 15 cae martes, igual se ejecuta ese día por la regla del día del mes, y también se ejecuta el lunes anterior o posterior por la regla del día de la semana.
Esta regla de "o" solo aplica cuando ambos campos están restringidos. Si uno de los dos es * (por ejemplo, 0 0 * * 1, "todos los lunes"), el comportamiento es el intuitivo: solo esa condición importa.
Zona horaria
cron ejecuta las tareas según la zona horaria configurada en el sistema (o la variable CRON_TZ en implementaciones que la soportan), no en UTC necesariamente. Esta herramienta calcula las próximas ejecuciones usando la zona horaria del navegador de quien la usa, como referencia — para saber exactamente en qué zona horaria corre un cron en producción hay que revisar la configuración del servidor donde está programado.
Macros comunes
Muchas implementaciones de cron (incluyendo crontab de Linux) aceptan atajos con @ en lugar de 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 cron de 5 campos (o una macro como @daily) y la herramienta la traduce a una descripción en palabras simples, campo por campo, y calcula las próximas 5 fechas y horas en que se ejecutaría a partir de este momento. Si el día del mes y el día de la semana están restringidos a la vez, se muestra una nota explicando la regla de "o" para que el resultado no sorprenda.