03 / GUÍAS
Escribir expresiones cron que no disparan sorpresas
Los cinco campos y sus rangos, nombres frente a números, la trampa OR entre día del mes y día de la semana, el domingo como 0 o 7, huecos y solapamientos del horario de verano, y la validación con una vista previa de próximas ejecuciones antes de desplegar.
Cinco campos, leídos de izquierda a derecha
Una expresión cron clásica son cinco campos separados por espacios: minuto (0–59), hora (0–23), día del mes (1–31), mes (1–12) y día de la semana (0–7). Cada campo acepta un valor único, una lista separada por comas, un rango con guion, un paso tras una barra o un asterisco para todos los valores.
La mayoría de los errores de cron no son sintaxis exótica sino un campo corriente leído con descuido: un paso que se reinicia en el límite del rango, o un campo de hora escrito para un reloj de doce horas en un sistema que cuenta hasta veintitrés.
- ListasLas listas eligen valores discretos: 0,30 en el campo de minuto se dispara en punto y a la media.
- Rangos y pasosLos rangos eligen un intervalo: 9-17 en el campo de hora cubre el horario laboral, y un paso lo adelgaza—9-17/2 se dispara cada dos horas dentro del intervalo.
- El asterisco lo cubre todoEl asterisco no es “ignora este campo”; coincide activamente con todos los valores, lo que se vuelve importante en cuanto interactúan dos campos de día.
Los nombres son números con mejor documentación
Los campos de mes y día de la semana aceptan nombres ingleses de tres letras—de JAN a DEC y de SUN a SAT—como alias de sus números. 0 9 * JAN MON y 0 9 * 1 1 son el mismo horario, pero la versión con nombres se explica sola al siguiente lector y resiste las ediciones de uno-de-más.
- Sin distinción de mayúsculasLos nombres se analizan sin distinguir mayúsculas—mon, Mon y MON funcionan—pero las mayúsculas son la convención que se lee como intencionada.
- Nombres en rangosLos nombres también funcionan dentro de rangos y listas: MON-FRI es el intervalo laboral estándar, y JAN,APR,JUL,OCT elige los meses trimestrales.
- Lee la explicaciónCreador y explicador Cron normaliza la expresión y explica cada campo por separado—“month: every value”, “weekday: 1, 2, 3, 4, 5”—para que confirmes que el analizador leyó los nombres como tú quisiste.
Los dos campos de día se combinan con OR
Esta es la sorpresa más cara de cron: cuando el día del mes y el día de la semana están ambos restringidos—ninguno es un asterisco—el horario se dispara cuando cualquiera de los dos coincide. 0 9 13 * FRI no significa “viernes 13”; significa el día 13 de cada mes y todos los viernes.
La salida del explicador es explícita sobre esto: informa de la semántica como dom-dow-or junto a las ejecuciones calculadas, así que una expresión que se disparará mucho más a menudo de lo previsto muestra su juego antes de llegar a un crontab.
- Un comodín es simpleSi cualquiera de los campos de día es un asterisco, el otro manda en solitario, que es el comportamiento intuitivo que la mayoría espera en todas partes.
- Ambos restringidos es ORAmbos restringidos significa OR: la semántica clásica de Vixie cron, seguida por la mayoría de los planificadores Unix, ejecuta la tarea cuando coincide el día del mes o el día de la semana.
- AND necesita un rodeoPara acertar un auténtico viernes 13, deja que cron seleccione el día 13 y haz que el propio comando compruebe el día de la semana—o usa un planificador con semántica AND, que el cron clásico no es.
El domingo es 0, y normalmente también 7
El campo de día de la semana numera el domingo como 0, el lunes como 1 y así hasta el sábado como 6. La mayoría de las implementaciones también aceptan 7 como segundo domingo para quienes cuentan desde el lunes—el analizador de Toolars normaliza 7 a 0 internamente—pero algunos sistemas solo aceptan uno de los dos, y en otros lugares existe la numeración estilo ISO que empieza el lunes en 1.
- 0 y 70 y 7 son ambos domingo donde se acepta 7; escribir 0 es la opción portable entre planificadores.
- Uno-de-más silenciosoUn día 7 en un sistema que lo rechaza falla ruidosamente al desplegar, pero un día mal leído como “séptimo día contando desde el lunes” falla en silencio el día equivocado.
- Reconfirma por plataformaCuando una expresión se mueve entre implementaciones—crontab del sistema, una plataforma de contenedores, un planificador de CI—vuelve a confirmar la numeración de días en lugar de asumir que sobrevivió al viaje.
El horario de verano tuerce el horario
Cron se dispara según la hora de reloj en la zona horaria del planificador, y dos veces al año el reloj se porta mal. En el hueco de primavera una hora local como las 02:30 simplemente no existe; en el retroceso de otoño existe dos veces. Un horario clavado a ese minuto saltará una ejecución en marzo y puede dispararse dos veces en noviembre.
- La hora perdidaHueco de primavera: una tarea de las 02:30 en la noche de la transición no tiene hora de reloj coincidente, así que nada se dispara—sin error, sin reintento, solo una ejecución perdida.
- La hora duplicadaSolapamiento de otoño: la misma hora de reloj ocurre dos veces, y las implementaciones difieren sobre si la tarea se dispara una o dos veces; asume dos salvo que hayas verificado lo contrario.
- UTC no tiene DSTLa salida limpia es UTC: no tiene transiciones de horario de verano, así que 30 2 * * * significa el mismo instante todos los días del año. El explicador ofrece UTC, la zona local del dispositivo y zonas con nombre como America/New_York y Europe/London.
Valida con las próximas ejecuciones, no con esperanza
La diferencia entre una expresión correcta y una de aspecto plausible es una lista de instantes de disparo concretos. Creador y explicador Cron calcula las próximas diez ejecuciones desde ahora en la zona horaria que elijas, buscando hasta 366 días adelante, y evalúa en un worker en segundo plano para que una expresión pesada no pueda atascar la pestaña.
- Lee las ejecucionesLee las primeras ejecuciones contra la intención: “laborables a las 09:00” debería mostrar de lunes a viernes a las nueve, y un sábado en la lista es la trampa OR delatándose.
- Cruza una transiciónCruza a propósito una frontera de horario de verano: elige una fecha de marzo o noviembre en una zona con nombre y confirma que el horario sigue haciendo lo que esperas cuando se mueven los relojes.
- Errores explícitosLos fallos son explícitos: un campo inválido, un número de campos incorrecto o un horario incapaz de producir diez ejecuciones dentro de la ventana de búsqueda reciben cada uno un error con nombre en lugar de una lista vacía y silenciosa.
Los horarios y los patrones comparten una disciplina.
Ambos son cadenas diminutas con un radio de daño desmedido—aprende el bucle escribir-probar-refactorizar para expresiones regulares, ejecutado en un worker local con tiempo límite.