Expresión cron
Analizador de expresiones cron te explica una programación en lenguaje claro y lista sus diez próximas ejecuciones, en tu navegador. Enuncia la regla que atrapa a casi todo el mundo: cuando se restringen el día del mes y el día de la semana a la vez, cron los combina con OR —así que 0 0 13 * 5 se dispara el día 13 o en cualquier viernes, y no es el viernes 13.
¿Cómo funciona Expresión cron?
Cron son cinco números y aun así se malinterpreta con fiabilidad. Tres cosas explican casi todos los errores.
Los dos campos de día se combinan con OR, no con AND
Cualquier otra pareja de campos se interseca: 0 9 * 6 * son las nueve en junio, hora y mes. Los campos de día no. Cuando se restringen el día del mes y el día de la semana a la vez, el trabajo se ejecuta si cualquiera de los dos coincide. Así, 0 0 13 * 5 se dispara el día 13 de cada mes y todos los viernes —unas cinco veces al mes, no una o dos veces al año—. Está en POSIX y en la página de manual de Vixie cron, y aun así sigue sorprendiendo a la gente; por eso la explicación de aquí lo deja dicho explícitamente en lugar de describir los campos por separado.
Cuando uno de los dos es *, el otro decide solo, razón por la que 0 0 * * 5 es, sin más, todos los viernes.
El cálculo de la próxima ejecución es una búsqueda que tiene que terminar
0 0 31 2 * pide la medianoche del 31 de febrero, que nunca llega. Un barrido minuto a minuto necesita 2.6 millones de iteraciones para llegar a un límite de un año y darse por vencido; un barrido sin límite no se rinde nunca. La búsqueda de aquí salta por la unidad más grande que pueda descartar —un mes que no coincide avanza al día 1 del mes siguiente, en lugar de recorrer sus días—, de modo que una programación imposible se demuestra imposible en unos cientos de pasos.
Todo aquí es UTC, a propósito
Un trabajo cron programado en una zona con horario de verano se ejecuta de verdad dos veces en una noche al año y ninguna en otra: cuando el reloj se atrasa, 01:30 ocurre dos veces; cuando avanza, 02:30 no ocurre. Las distintas implementaciones de cron lo manejan de forma distinta, y algunas no lo manejan en absoluto. Calcular en UTC y decirlo es honesto; aplicar en silencio la zona de tu navegador produciría horas con aspecto fiable que están mal dos veces al año.
Número de campos y dialectos
Cinco campos es el cron estándar de Unix. Seis suele significar segundos al principio, que es lo que hacen Quartz, Spring y node-cron —aunque algunos planificadores ponen el año al final, algo genuinamente ambiguo y que aquí se resuelve a favor de los segundos—. Siete campos es Quartz con ambos. El analizador acepta nombres de meses y de días, rangos que dan la vuelta como FRI-MON y 22-2, ? como comodín, tanto 0 como 7 para el domingo y la familia de abreviaturas de @daily.
@reboot se reconoce y se explica en lugar de analizarse: no tiene programación, así que no hay ninguna próxima ejecución que calcular.
Expresión
0 0 13 * 5
Explicación
At 00:00, on day 13 of the month OR on Friday — cron ORs these two fields rather than intersecting them, so this is not "Friday the 13th". UTC.
¿Qué opciones y casos límite admite Expresión cron?
| Parámetro | Tipo | Valor predeterminado | Comportamiento y casos límite |
|---|---|---|---|
| * | comodín | todos los valores | En el campo día también significa 'dejar que el otro campo día decida', lo que hace que la regla OR sea manejable. |
| */n | paso | — | Cada n-ésimo valor desde el mínimo del campo. */15 en minutos es 0, 15, 30, 45 — no 'cada 15 minutos desde ahora'. |
| a-b | rango | — | Inclusivo. Se acepta un rango envolvente: 22-2 en horas es 22, 23, 0, 1, 2, y VIE-DOM es el fin de semana. |
| a,b,c | lista | — | Cualquier combinación de valores individuales, rangos y pasos, separados por comas. |
| n/m | paso desde n | — | 5/6 en horas es 5, 11, 17, 23 — desde 5 hasta el máximo, en pasos de 6. |
| Nombres | ENE-DIC, DOM-SAB | aceptado | No distingue entre mayúsculas y minúsculas, y se puede usar en rangos: ENE-MAR, DOM-VIE. |
| 0 y 7 | domingo | ambos | Toda implementación acepta ambos, y casi ninguna documentación menciona esto en el mismo lugar que otra cosa. |
| ? | comodín | Quartz | Se trata como *. Quartz lo usa para significar 'sin valor específico' en un campo día. |
| Número de campos | 5, 6 o 7 | 5 | Cinco es estándar Unix. Se lee como segundos primero, que es lo que significan Quartz, Spring y node-cron. Siete es Quartz con un año. |
| @daily y similares | abreviatura | expandido | @yearly @annually @monthly @weekly @daily @midnight @hourly. @reboot no tiene programación y se explica en lugar de analizarse. |
| Zona horaria | UTC | siempre | Un programa de hora local realmente se ejecuta dos veces en una sola noche al año y en absoluto en otra. Calcular en UTC y decirlo supera producir horas locales incorrectas con confianza. |
Preguntas frecuentes
¿Se ejecuta 0 0 13 * 5 el viernes 13?
No —se ejecuta el día 13 de cada mes y todos los viernes. Cron combina los dos campos de día con OR en lugar de intersecarlos, que es lo contrario de lo que hace cualquier otra pareja de campos y el malentendido más común de cron. Para el viernes 13 en concreto necesitas una restricción de día del mes más una comprobación dentro del propio trabajo; cron no puede expresar esa intersección.
¿Qué significa realmente */15?
Cada valor divisible por 15 dentro del campo, empezando por el mínimo del campo —en minutos son 0, 15, 30 y 45—. No significa «cada quince minutos desde que hice el despliegue». Esa distinción importa al combinarlo con una restricción de hora: 0 */2 * * * se ejecuta a las 00:00, 02:00, 04:00 y así sucesivamente, no dos horas después de cada ejecución anterior.
¿Por qué todas las horas están en UTC?
Porque una programación en hora local es genuinamente ambigua dos veces al año. Cuando el reloj se atrasa, 01:30 ocurre dos veces y algunas implementaciones ejecutan el trabajo dos veces; cuando avanza, 02:30 no ocurre y algunas lo saltan por completo. El comportamiento varía entre implementaciones de cron. Mostrar UTC y decirlo es honesto; aplicar en silencio la zona de tu navegador produciría horas de aspecto fiable que están mal dos días al año.
¿Cinco, seis o siete campos?
Cinco para el cron de Unix, crontab y la mayoría de los planificadores de CI. Seis para Quartz, el @Scheduled de Spring y node-cron, donde el campo extra va primero y son los segundos. Siete para Quartz con un año al final. Seis campos es genuinamente ambiguo —algunos planificadores ponen el año al final— y este analizador lo lee con los segundos primero, que es lo mucho más común.
¿Por qué mi expresión no muestra ninguna ejecución?
No puede dispararse nunca. La causa habitual es una combinación de día del mes y mes que no existe —0 0 31 2 * pide el 31 de febrero— o una restricción de año que ya pasó. La búsqueda mira cinco años por delante antes de concluir esto, así que una lista vacía significa genuinamente imposible y no simplemente lejano.
¿Se sube mi expresión?
No. El análisis y la búsqueda de la próxima ejecución se ejecutan ambos en tu navegador. Una expresión cron no es un secreto, pero sí describe el ritmo de tu infraestructura, y no hay razón para que eso llegue a un servidor que no tiene uso para ello.