Analizador de expresiones cron
Lea una expresión cron en inglés sencillo y vea exactamente cuándo se activará la próxima vez.
minuto · hora · día del mes · mes · día de la semana. También valen macros como @daily.
Esto se ejecuta
a las 03:00, los lunes
Las seis próximas ejecuciones · UTC
- 2026-09-21 03:00lunes
- 2026-09-28 03:00lunes
- 2026-10-05 03:00lunes
- 2026-10-12 03:00lunes
- 2026-10-19 03:00lunes
- 2026-10-26 03:00lunes
Se muestra en UTC. Un crontab real se ejecuta en la zona horaria del servidor, y ahí es donde el cambio de hora da problemas: mira más abajo.
Campo por campo
- minuto
- 00
- hora
- 33
- día del mes
- *cualquiera
- mes
- *cualquiera
- día de la semana
- 11
Lo que conviene saber de esta programación
- El día 31 no existe en todos los meses, así que en esos meses sencillamente no se ejecutará.
- El 29 de febrero solo existe en años bisiestos: esto se ejecuta una vez cada cuatro años.
Cinco campos, del más fino al más grueso
| Posición | Campo | Rango | Notas |
|---|---|---|---|
| 1 | Minuto | 0–59 | |
| 2 | Hora | 0–23 | Reloj de 24 horas, hora del servidor |
| 3 | Día del mes | 1–31 | Los días que no existen simplemente se saltan |
| 4 | Mes | 1–12 | O JAN–DEC |
| 5 | Día de la semana | 0–7 | El 0 y el 7 significan domingo. O SUN–SAT |
Dentro de un campo: * es cualquiera, , enumera valores, - da un rango y / marca el paso. */15 en el campo de los minutos es cada quince minutos; 5/10 significa desde el 5 en adelante de diez en diez, o sea 5, 15, 25 y así. Los rangos pueden dar la vuelta, así que FRI-MON es una manera válida de decir el fin de semana y sus bordes.
La regla que pilla a todo el mundo
Esto es lo único que merece la pena llevarse de esta página.
Cuando están restringidos los dos campos, el del día del mes y el del día de la semana, cron ejecuta la tarea cuando coincide cualquiera de ellos. No los dos. Es un O, y se lee como un Y.
0 0 1 * MON # NOT "the 1st, if it is a Monday"
# Actually: every 1st, AND every MondayEsa programación se dispara unas cinco veces al mes. Pégala en el analizador de arriba y mira las próximas ejecuciones: la secuencia lo delata al instante.
La regla solo se aplica cuando los dos campos están restringidos. Si alguno es *, manda simplemente el otro, y por eso 0 0 * * MON se comporta exactamente como se espera. El comportamiento está en la especificación POSIX y lo implementa cualquier cron corriente, así que no es un fallo que puedas quitar por configuración.
Para exigir de verdad las dos condiciones, restringe un campo en la programación y comprueba el otro al principio de la tarea:
0 0 * * MON [ "$(date +\%d)" = "01" ] && /usr/local/bin/jobEl cambio de hora, que rompe tareas dos veces al año
Cron se ejecuta en la zona horaria local del servidor salvo que se le diga otra cosa, y la hora local no es continua. Cuando los relojes se adelantan, desaparece una hora: una tarea programada para las 02:30 puede saltarse por completo o dispararse a las 03:30, según qué cron tengas. Cuando los relojes se atrasan, la 01:30 ocurre dos veces, y la tarea también puede hacerlo.
El Vixie cron moderno se esfuerza —las tareas que se pierden por un salto hacia delante suelen ejecutarse una vez después—, pero el comportamiento no es consistente entre implementaciones, y los programadores de contenedores vuelven a variar.
El arreglo duradero es ejecutar el programador en UTC y convertir en los bordes. Los CronJobs de Kubernetes usan UTC por defecto exactamente por esto. Si una tarea tiene que ejecutarse a una hora local concreta, asume que durante parte del año se desviará una hora, o usa un programador que entienda de husos horarios de verdad: los temporizadores de systemd lo hacen.
Otras razones por las que una tarea de cron no se ejecuta
- El entorno está casi vacío. Cron no carga tu perfil de shell, así que el
PATHes mínimo y tu entorno virtual no está activo. Usa rutas absolutas, siempre. - Un signo de porcentaje suelto. En un crontab,
%significa salto de línea.date +%Yse rompe en silencio; tiene que serdate +\%Y. - Sin salto de línea final. Algunos cron ignoran la última línea de un crontab que no termina con uno.
- La salida no va a ninguna parte. Cron envía la salida por correo al usuario, y si el correo no está configurado se esfuma. Redirígela a un archivo de registro para que los fallos se vean.
- Ejecuciones que se solapan. Cron no espera a que termine la ejecución anterior. Una tarea de cinco minutos con una programación de un minuto se va acumulando hasta que algo revienta. Usa
flock.
Lo que cron no puede expresar
Los campos son independientes, así que todo lo que no divida de forma exacta una hora o un día queda fuera de su alcance. «Cada 90 minutos» no se puede escribir. Tampoco «el último viernes del mes» en cron estándar: para eso existen la L y la # de Quartz, y por eso no son portables.
Si te ves peleándote con la sintaxis, suele ser la señal para pasarte a un programador que piense en intervalos y no en campos de calendario. Un temporizador de systemd con OnUnitActiveSec=90min dice lo que querías decir en una sola línea.
Relacionado
Las horas de ejecución de arriba están en UTC: el conversor de marcas de tiempo te pondrá cualquiera de ellas en tu propia zona horaria, o en el formato que registre tu programador. Para casar texto en lugar de programar, el probador de expresiones regulares está al lado.
Preguntas sobre cron
¿Por qué mi trabajo se ejecuta en días que no programé?
Es casi seguro que la regla del día del mes y del día de la semana. Cuando ambos campos están restringidos, cron ejecuta el trabajo cuando CUALQUIERA coincide, no ambos. Entonces 0 0 1 * MON se activa el primero de cada mes y todos los lunes, que es aproximadamente cinco veces al mes en lugar de la vez que quería decir. Si alguno de los campos es *, la regla no se aplica y el otro simplemente rige. Para exigir ambas condiciones, restrinja un campo en cron y marque el otro dentro del trabajo.
¿Qué significan los cinco campos?
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 significan domingo). La lectura de izquierda a derecha se vuelve progresivamente más tosca, lo cual es una mnemónica útil. Algunos programadores (Quartz, Spring y varios corredores de trabajos) anteponen un sexto campo para los segundos; El crontab estándar no tiene ningún campo de segundos.
¿Qué sucede con un trabajo cron durante el horario de verano?
Depende de la implementación, y aquí es donde los trabajos programados se interrumpen silenciosamente dos veces al año. Cuando los relojes avanzan, no existe una hora; un trabajo de las 02:30 puede omitirse por completo o ejecutarse a las 03:30, según el cron. Cuando los relojes retroceden, la 01:30 ocurre dos veces, por lo que el trabajo puede ejecutarse dos veces. Los temporizadores Vixie cron y systemd modernos intentan ser sensatos al respecto; los mayores no. La respuesta sólida es ejecutar el trabajo programado en UTC y realizar la conversión en los bordes.
¿Qué son L, W y # y por qué se rechazan aquí?
Son extensiones de Quartz: L para "último" (último día del mes, último viernes), W para el día laborable más cercano y # para "el enésimo día laborable del mes". Son realmente útiles y no son cron estándar. crontab, Kubernetes CronJobs y GitHub Actions los rechazarán o los interpretarán mal. Este analizador se niega en lugar de adivinar, porque un programa que ignora silenciosamente una L estaría equivocado exactamente en la forma en que nadie lo verifica.
¿Qué hace @reboot?
Ejecuta el trabajo una vez cuando se inicia cron, generalmente en el arranque. No tiene una programación recurrente, por lo que no hay tiempos de ejecución siguientes que calcular, razón por la cual esta herramienta lo dice en lugar de mostrar una lista vacía. Vale la pena saber que @reboot se activa cuando se inicia el demonio cron, no cuando la máquina termina de iniciarse, por lo que cualquier cosa que dependa de que la red esté activa necesita su propia espera.
¿Cómo ejecuto algo cada 90 minutos?
No puedes expresarlo directamente, y esto es una limitación genuina más que un truco que no has aprendido. Los campos cron son independientes, por lo que */90 en el campo de minutos no es válido y no hay forma de crear una programación que no se divida uniformemente en una hora o un día. Las soluciones son dos entradas que cubran el patrón a lo largo de un día o, más honestamente, un programador de trabajos que piense en intervalos en lugar de campos de calendario, como un temporizador systemd con OnUnitActiveSec.
Última revisión . ¿Has visto algo desactualizado? Dínoslo.
