Expresiones cron
Pegas «15 3 * * 1-5» y sale qué significa, en palabras claras, con las próximas ejecuciones día a día en el huso horario que elijas. O al revés: compón la planificación desde los menús y te llevas la expresión.
¿No la tienes? Compónla aquí
Qué dialecto lee esta página
Cron no es uno solo, y esta es la primera cosa que hay que saber: aquí se lee el crontab clásico de cinco campos (minuto, hora, día del mes, mes, día de la semana), más la forma de seis campos con los segundos delante de todo, la que escriben Spring y node-cron, más los atajos @yearly, @monthly, @weekly, @daily, @midnight y @hourly. El domingo se puede escribir 0 o 7, y los nombres ingleses de tres letras (MON, FRI, JAN, DEC) valen perfectamente.
Lo que no es de este dialecto se rechaza con el motivo escrito, en lugar de leerlo a medias: los símbolos de Quartz (el signo de interrogación, la L del último día, la W del día laborable más cercano, la almohadilla del tercer domingo), los siete campos de Quartz con el año al final, y @reboot, que no es una hora sino un suceso y por tanto no tiene ninguna próxima vez que calcular. Vale también para un intervalo escrito al revés, como 5-1: cada uno lo lee a su manera, y dar una respuesta sería peor que declararlo. Si el oficio de hoy son las redes en vez de las planificaciones, la página correcta es Cálculo de subred.
El día del mes y el día de la semana van en O
Es la trampa que hace perder más horas de todas, y parece un detalle: cuando los dos campos de los días están escritos, el crontab clásico no los pone en Y, los pone en O. Es decir, «0 0 13 * 5» no quiere decir «el trece del mes, si es viernes»: quiere decir el trece del mes, y además todos los viernes. Quien esperaba una ejecución al mes se encuentra con cinco o seis.
La regla vale solo cuando están restringidos los dos. Si uno de los dos es un asterisco, manda el otro y ya está, que es el caso normal. Por eso la lista de aquí arriba es la parte que de verdad cuenta: las fechas se leen una a una y se nota enseguida si vienen más apretadas de lo que se tenía en mente. Cuando los dos campos están escritos, la página lo dice con letras, para que nadie se entere por casualidad.
Por qué «*/7» no quiere decir «cada siete minutos»
El paso no cuenta los minutos que pasan: vuelve a empezar de cero cada hora. Con «*/7» las ejecuciones caen en los minutos 0, 7, 14, 21, 28, 35, 42, 49 y 56, y luego se vuelve al minuto 0 de la hora siguiente: entre las 00:56 y la 01:00 pasan cuatro minutos, no siete. En una máquina que hace un trabajo pesado, esos dos arranques seguidos son justo donde las cosas se amontonan.
La cuenta cuadra cuando el paso divide a sesenta, es decir 2, 3, 4, 5, 6, 10, 12, 15, 20 y 30: solo en esos casos «cada N minutos» es una descripción verdadera. En las horas vale el mismo razonamiento con veinticuatro, así que «*/13» no es «cada trece horas» sino las horas 0 y 13, con once horas de vacío en medio. Por eso la frase que lees aquí arriba enumera los minutos de verdad en lugar de repetir el paso: la descripción cómoda es la que te hace equivocarte.
El horario de verano, y por qué cada fecha se vuelve a comprobar
El cambio de hora es el punto en el que hasta los cron de verdad no se ponen de acuerdo entre ellos, así que la regla de esta página está escrita en vez de sobreentendida: se razona en hora de pared, y si esa hora esa noche no existe, porque las agujas saltan hacia delante, la ejecución se salta y se dice; si en cambio existe dos veces, porque vuelven atrás, se cuenta una sola vez, la primera. Un cron de verdad, esa misma noche, podría recuperar la ejecución saltada o lanzar dos.
Por el mismo motivo cada fecha producida se vuelve a leer: desde el instante se regresa a la hora de pared en el huso elegido y se comprueba campo por campo con un segundo trozo de código, escrito a propósito de otra manera. Si la comprobación no cuadra no se imprime nada, porque una fecha equivocada dicha con seguridad es peor que ninguna fecha. Y si lo único que necesitas es saber qué hora es ahora mismo en otra parte del mundo, el camino corto es Reloj mundial.