Próximas ejecuciones
Cada planificador trata de forma distinta detalles como día del mes frente a día de la semana o el horario de verano. Prueba la programación en tu sistema antes de usarla en producción.
0 9 * * 1 se ejecuta cada lunes a las 09:00, 52 o 53 veces al año. Ojo: @weekly significa 0 0 * * 0, el domingo a medianoche, algo que sorprende a mucha gente. En cron de Unix el domingo puede ser 0, 7 o SUN; en Quartz es 1 o SUN.
Cómo se usa
- Escribe o pega una expresión cron, o toca un ajuste rápido. El formato sigue el número de campos: 5 es crontab de Unix, 6 es Spring (con segundos), 7 o un ? es Quartz.
- Lee la descripción en lenguaje claro y las 10 próximas ejecuciones. Elige una zona horaria para ver cuándo se lanza allí; toca una hora para copiarla en ISO 8601.
- Usa el editor visual para cambiar un campo cada vez: todos los valores, un intervalo, valores concretos o un rango.
- Al cambiar entre Unix, Quartz y Spring la expresión se convierte cuando es posible.
- En cron de Unix, si día del mes y día de la semana están restringidos, la tarea se ejecuta cuando coincide cualquiera de los dos (O). Quartz exige ? en uno de ellos; Spring exige que coincidan ambos.
- En Unix los días de la semana van de 0 a 7 (0 y 7 = domingo); Quartz usa 1–7 con 1 = domingo. Los nombres como MON-FRI valen en todos.
- Quartz y Spring también admiten L (último día), W (día laborable más cercano), 5L (último viernes) y 2#1 (primer lunes).
- Las horas que caen en el salto del horario de verano se omiten; cada demonio cron lo trata a su manera.
Los cinco campos de Unix
Una línea de crontab estándar tiene cinco campos: minuto (0–59), hora (0–23), día del mes (1–31), mes (1–12 o JAN–DEC) y día de la semana (0–7, donde 0 y 7 son domingo, o SUN–SAT). * significa todos los valores, la coma enumera (1,15), el guion marca un rango (9-17) y la barra un intervalo (*/15 equivale a 0, 15, 30 y 45).
Así, 30 2 * * 1-5 se ejecuta a las 02:30 de lunes a viernes y 0 */6 * * * a las 00:00, 06:00, 12:00 y 18:00. Los atajos @hourly, @daily, @weekly y @monthly equivalen a 0 * * * *, 0 0 * * *, 0 0 * * 0 y 0 0 1 * *.
Diferencias de Quartz y Spring
Quartz añade un campo de segundos al principio y un año opcional al final, numera los días de la semana del 1 al 7 empezando por el domingo y exige ? en el día del mes o en el día de la semana. Spring @Scheduled usa seis campos (los segundos primero) y días 0–7. Ambos admiten L para el último día, W para el día laborable más cercano, 6L para el último viernes y 2#1 para el primer lunes del mes.
Errores habituales
En cron de Unix, si restringes a la vez el día del mes y el de la semana, la tarea se ejecuta cuando se cumple cualquiera: 0 0 13 * 5 salta todos los días 13 y todos los viernes, no solo los viernes 13. Los demonios cron usan la zona horaria del servidor salvo que se indique otra, y GitHub Actions funciona siempre en UTC. Con los cambios de horario de verano, una tarea a las 02:30 puede saltarse o repetirse según la implementación, así que usa UTC para lo crítico.
Preguntas frecuentes
¿Qué significa * * * * *?
Que se ejecuta cada minuto de cada hora de cada día: 1440 veces al día. Cada * representa todos los valores de su campo, en el orden minuto, hora, día del mes, mes y día de la semana.
¿Cómo ejecuto una tarea cron cada 5 minutos?
Con */5 * * * *. Se dispara en los minutos 0, 5, 10 y así hasta el 55, es decir, 288 veces al día. Para empezar en otro minuto, usa por ejemplo 2-59/5 * * * *.
¿Qué zona horaria usa cron?
El cron clásico usa la zona horaria local del servidor. Algunos sistemas aceptan CRON_TZ o un ajuste timeZone, los CronJob de Kubernetes tienen un campo timeZone y GitHub Actions usa siempre UTC. Elige aquí la zona para ver las horas correspondientes.
¿Qué diferencia hay entre cron de Unix y de Quartz?
El de Unix tiene 5 campos y empieza por los minutos. El de Quartz tiene 6 o 7, empieza por los segundos y puede terminar con el año, numera el domingo como 1 y necesita ? en uno de los dos campos de día.
¿Cómo programo una tarea el último día del mes?
Quartz y Spring admiten L en el día del mes: 0 0 0 L * ? en Quartz. El cron estándar de Unix no tiene L; lo habitual es ejecutar los días 28 a 31 y comprobar en el script si mañana es día 1.
¿Por qué mi tarea cron no se ejecutó a la hora prevista?
Revisa la zona horaria del servidor, que no hayas combinado sin querer día del mes y día de la semana, y que el comando funcione con el entorno mínimo de cron, donde PATH y las variables no son los de tu terminal.