Ejemplos de expresiones cron
84 horarios de crontab con la hora exacta en que se ejecuta cada uno.
Sin registro, sin rastreoLa sintaxis cron son cinco campos pequeños, y casi nadie la escribe de memoria. Esta es la tabla de consulta: 84 horarios de crontab que funcionan, agrupados por frecuencia, cada uno con una frase en español que dice exactamente cuándo se ejecuta.
Cada expresión de esta página se verificó enumerando un año calendario completo de ejecuciones, minuto a minuto, y comparando el resultado con su descripción. Eso incluye las que no significan lo que parecen: esas tienen su propia sección más abajo.
Cómo se leen los cinco campos
Una línea de crontab son cinco campos separados por espacios y luego el comando. De izquierda a derecha, los campos van de lo más fino a lo más grueso: minuto, hora, día del mes, mes y día de la semana.
* * * * * comando-a-ejecutar
| | | | |
| | | | +--- día de la semana (0-7; 0 y 7 son domingo)
| | | +----- mes (1-12, o JAN-DEC)
| | +------- día del mes (1-31)
| +--------- hora (0-23)
+----------- minuto (0-59)| Campo | Valores permitidos | Notas |
|---|---|---|
| Minuto | 0-59 | La resolución más fina que ofrece cron. |
| Hora | 0-23 | Reloj de 24 horas; el 0 es medianoche. |
| Día del mes | 1-31 | Un 31 simplemente nunca coincide en los meses cortos. |
| Mes | 1-12 o JAN-DEC | Los nombres van siempre en inglés y no distinguen mayúsculas. |
| Día de la semana | 0-7 o SUN-SAT | Tanto el 0 como el 7 son domingo. |
Hay cuatro operadores y funcionan en todos los campos. El asterisco significa todos los valores. La coma arma una lista (1,15). El guion arma un rango (9-17). La barra agrega un paso, ya sea sobre el campo completo (*/5) o dentro de un rango (8-18/2).
Cada pocos minutos
Los horarios más buscados. Conviene saber el límite duro desde el principio: el cron estándar revisa su tabla una vez por minuto, así que el intervalo más corto que puedes expresar es de un minuto. No existe forma de escribir "cada 30 segundos".
| Expresión | Cuándo se ejecuta |
|---|---|
| * * * * * | Cada minuto |
| */2 * * * * | Cada 2 minutos (:00, :02, :04 …) |
| */5 * * * * | Cada 5 minutos |
| */10 * * * * | Cada 10 minutos |
| */15 * * * * | Cada 15 minutos |
| */20 * * * * | Cada 20 minutos |
| */30 * * * * | Cada 30 minutos |
| 0,30 * * * * | Cada 30 minutos, escrito como lista |
| 15,45 * * * * | Dos veces por hora, a los :15 y :45 |
| 5 * * * * | Cada hora en el minuto 5 (01:05, 02:05 …) |
| */5 9-17 * * * | Cada 5 minutos entre las 09:00 y las 17:55 |
| */15 * * * 1-5 | Cada 15 minutos, solo de lunes a viernes |
| */10 9-17 * * 1-5 | Cada 10 minutos en horario de oficina, entre semana |
Cada pocas horas
Fija un minuto en el primer campo y aplica el paso al campo de la hora. Dejar el minuto en asterisco es un accidente frecuente: 0 */2 * * * corre doce veces al día, mientras que * */2 * * * corre 720.
| Expresión | Cuándo se ejecuta |
|---|---|
| 0 * * * * | Cada hora, en punto |
| 30 * * * * | Cada hora y media (a los :30) |
| 0 */2 * * * | Cada 2 horas (00:00, 02:00 …) |
| 0 */3 * * * | Cada 3 horas |
| 0 */4 * * * | Cada 4 horas |
| 0 */6 * * * | Cada 6 horas (00, 06, 12, 18) |
| 0 */8 * * * | Cada 8 horas (00, 08, 16) |
| 0 */12 * * * | Cada 12 horas (00:00 y 12:00) |
| 15 */2 * * * | Cada 2 horas a los :15 |
| 0 0,12 * * * | Dos veces al día, medianoche y mediodía |
| 0 8,13,18 * * * | Tres veces al día: 08:00, 13:00 y 18:00 |
| 0 9-17 * * * | Cada hora de 09:00 a 17:00 |
| 0 9-17 * * 1-5 | Cada hora en horario laboral, de lunes a viernes |
| 0 8-18/2 * * 1-5 | Cada 2 horas de 08:00 a 18:00, entre semana |
| 0 0-6 * * * | Cada hora de madrugada, de 00:00 a 06:00 |
Una o dos veces al día
Aquí se fijan el minuto y la hora, así que la tarea se ejecuta exactamente una vez por cada día que coincida. Son los horarios de respaldos, reportes, calentamiento de caché e importaciones nocturnas.
| Expresión | Cuándo se ejecuta |
|---|---|
| 0 0 * * * | Todos los días a medianoche |
| 0 1 * * * | Todos los días a la 1:00 |
| 0 3 * * * | Todos los días a las 3:00 (ventana típica de respaldo) |
| 5 4 * * * | Todos los días a las 4:05 |
| 30 6 * * * | Todos los días a las 6:30 |
| 0 12 * * * | Todos los días al mediodía |
| 0 22 * * * | Todos los días a las 22:00 |
| 45 23 * * * | Todos los días a las 23:45 |
| 59 23 * * * | Todos los días a las 23:59, el último minuto del día |
| 0 0 * * 1-5 | De lunes a viernes a medianoche |
| 0 7 * * 1-5 | De lunes a viernes a las 7:00 |
| 0 9 * * 6,0 | Solo fines de semana, a las 9:00 |
| 0 20 * * 0-4 | De domingo a jueves a las 20:00 |
Días concretos de la semana
El quinto campo acepta 0-7 o los nombres en inglés de tres letras: SUN, MON, TUE, WED, THU, FRI y SAT. Como el 0 y el 7 son domingo, un rango 1-5 es de lunes a viernes y 6,0 es el fin de semana.
| Expresión | Cuándo se ejecuta |
|---|---|
| 0 0 * * 0 | Todos los domingos a medianoche |
| 0 0 * * 7 | Todos los domingos: el 7 también es domingo |
| 0 0 * * SUN | Todos los domingos, con el nombre del día |
| 0 0 * * 1 | Todos los lunes a medianoche |
| 0 9 * * 1 | Todos los lunes a las 9:00 |
| 30 8 * * 2,4 | Martes y jueves a las 8:30 |
| 0 12 * * 1,3,5 | Lunes, miércoles y viernes al mediodía |
| 0 17 * * 5 | Todos los viernes a las 17:00 |
| 0 0 * * 6 | Todos los sábados a medianoche |
| 0 2 * * 0 | Todos los domingos a las 2:00 |
| 0 0 * * MON-FRI | De lunes a viernes, con nombres de día |
| 0 0 * * SAT,SUN | Solo fines de semana, a medianoche |
| 0 4 * * 1-5 | De lunes a viernes a las 4:00 |
Días del mes, meses y años
En cuanto restringes el día del mes o el mes, la tarea puede ejecutarse una sola vez al año. Cuidado con los meses cortos: una expresión fijada al día 31 no corre en los cinco meses que terminan en 30.
| Expresión | Cuándo se ejecuta |
|---|---|
| 0 0 1 * * | A medianoche del día 1 de cada mes |
| 0 5 1 * * | A las 5:00 del día 1 de cada mes |
| 0 0 15 * * | A medianoche del día 15 de cada mes |
| 0 0 1,15 * * | Dos veces al mes, el 1 y el 15 |
| 0 0 28 * * | El día 28: el último día que todos los meses tienen seguro |
| 0 0 */2 * * | Cada 2 días del mes (1, 3, 5 …, y reinicia cada mes) |
| 0 3 1 */3 * | Trimestral: a las 3:00 del día 1 de enero, abril, julio y octubre |
| 0 0 1 1,4,7,10 * | El mismo calendario trimestral, escrito como lista |
| 0 0 1 */6 * | Dos veces al año: 1 de enero y 1 de julio |
| 0 0 1 1 * | Una vez al año, a medianoche del 1 de enero |
| 0 0 25 12 * | Una vez al año, a medianoche del 25 de diciembre |
| 0 0 1 JAN,JUL * | Dos veces al año, con los nombres de los meses |
| 0 0 * 1 * | Todos los días, pero solo en enero |
| 0 0 * 6-8 * | Todos los días de junio a agosto |
| 0 0 29 2 * | Solo el 29 de febrero, es decir, solo en años bisiestos |
| 0 0 1-7 * * | Todos los días de la primera semana del mes |
Los atajos con @
Casi todas las implementaciones de cron aceptan unos cuantos atajos con nombre en lugar de los cinco campos. Son solo alias: todo lo que hacen se puede escribir igual de bien en formato largo.
| Expresión | Cuándo se ejecuta |
|---|---|
| @hourly | Igual que 0 * * * *: cada hora en punto |
| @daily | Igual que 0 0 * * *: todos los días a medianoche |
| @midnight | Un alias de @daily |
| @weekly | Igual que 0 0 * * 0: domingos a medianoche |
| @monthly | Igual que 0 0 1 * *: el día 1 a medianoche |
| @yearly | Igual que 0 0 1 1 *: el 1 de enero a medianoche |
| @annually | Un alias de @yearly |
Existe uno más, @reboot, que ejecuta la tarea una vez después de que arranca la máquina. No aparece en la tabla a propósito, porque no es un horario: no tiene próxima ejecución y nadie puede predecir cuándo va a correr.
Expresiones que no significan lo que parecen
Todas son válidas y todas las escribe alguien esperando otro comportamiento. Las descripciones de abajo son lo que ocurre de verdad.
| Expresión | Cuándo se ejecuta |
|---|---|
| 0 0 1 * 1 | Se ejecuta el día 1 O todos los lunes, no solo cuando coinciden |
| 0 0 1-7 * 1 | Días 1 al 7 O todos los lunes: esto NO es "el primer lunes" |
| 0 12 13 * 5 | Al mediodía los días 13 y también todos los viernes |
| */45 * * * * | Solo a los :00 y :45: el paso reinicia cada hora |
| 0 */7 * * * | A las 00, 07, 14 y 21: el paso de 7 horas también reinicia cada día |
| 0 0 31 * * | Solo en los meses que tienen día 31 (7 meses al año) |
| 0 0 30 2 * | Nunca se ejecuta: febrero nunca tiene día 30 |
Tres reglas que explican casi todos los errores
- El paso cuenta desde el inicio del campo, no desde ahora. */45 no significa "cada 45 minutos": significa los minutos 0 y 45 de cada hora, y el hueco entre la segunda ejecución y la siguiente es de 15 minutos, no de 45. Lo mismo pasa con */7 en el campo de la hora, que se reinicia a medianoche.
- Cuando restringes a la vez el día del mes y el día de la semana, cron ejecuta la tarea cuando coincide cualquiera de los dos, no cuando coinciden ambos. El manual de crontab lo dice sin rodeos: el comando se ejecuta cuando cualquiera de los dos campos coincide. Si uno de los dos queda en *, ese campo se ignora y el comportamiento vuelve a ser el intuitivo.
- Cron usa el reloj de la máquina donde corre, y esa máquina está en UTC muchísimas veces aunque tú no lo estés. Un horario que tú lees como las 03:00 puede estar corriendo a media tarde en el servidor, así que confirma la zona horaria del host antes de confiar en una ventana nocturna.
Otra ausencia que hay que planificar: el cron de Unix no tiene sintaxis para "el último día del mes". Lo habitual es programar la tarea el día 28, o correrla a diario y que el propio comando salga temprano salvo que mañana sea día 1.
Cron de Unix, Quartz y Spring: no son la misma sintaxis
Si copiaste una expresión de un tutorial de Java y tu crontab la rechaza, casi seguro es una expresión de Quartz. Quartz usa seis campos obligatorios —segundos, minutos, horas, día del mes, mes y día de la semana— más un séptimo opcional para el año. Al empezar con los segundos, cada expresión de Quartz lleva un campo de más y el cron de Unix la rechaza por tener seis campos en lugar de cinco.
Quartz también agrega caracteres que el cron de Unix no entiende: ? para dejar sin especificar uno de los dos campos de día, L para el último día del mes, W para el día hábil más cercano y # para "el enésimo de ese mes" (por ejemplo 6#3 es el tercer viernes). Y como tiene campo de segundos, sí puede hacer lo que el cron estándar no: 0/30 * * * * ? se ejecuta cada 30 segundos. Spring usa la misma idea de seis campos con los segundos al frente.
Cómo validar tu propia expresión
Una tabla solo puede cubrir los horarios que más se piden. Cuando tengas una expresión que no esté aquí, pégala en el explicador de expresiones cron de este sitio: convierte la línea en una oración, te muestra las próximas cinco ejecuciones en tu zona horaria y te señala el campo inválido cuando no se puede leer. Todo corre en tu navegador.