¿Qué es una expresión cron? Sintaxis, campos y 15 ejemplos
Una expresión cron es una cadena corta que le indica a un programador de tareas cuándo ejecutar un trabajo. La forma estándar tiene cinco campos separados por espacios: minuto, hora, día del mes, mes y día de la semana. Por ejemplo, */15 * * * * significa «cada 15 minutos»: */15 en el campo de minutos coincide con los minutos 0, 15, 30 y 45, y los cuatro asteriscos significan cualquier hora, cualquier día, cualquier mes y cualquier día de la semana.
Pruébalo gratis: Generador de Crontab Gratis y sin necesidad de cuenta.
El nombre viene de cron, el programador de tareas de Unix, pero hoy la misma sintaxis controla pipelines de CI, programadores en la nube y frameworks de aplicaciones, a veces con campos adicionales. Esta guía explica la sintaxis, 15 ejemplos comprobados, las variantes más comunes y los errores que hacen que un trabajo se ejecute a la hora equivocada. Para comprobar cualquier expresión mientras lees, pégala en el generador de Crontab gratuito, que describe la programación con palabras sencillas.
Los cinco campos de una expresión cron
Los campos se leen de izquierda a derecha:
| Posición | Campo | Valores permitidos | Nombres |
|---|---|---|---|
| 1 | Minuto | 0–59 | – |
| 2 | Hora | 0–23 | – |
| 3 | Día del mes | 1–31 | – |
| 4 | Mes | 1–12 | jan–dec |
| 5 | Día de la semana | 0–7 (0 y 7 son domingo) | sun–sat |
Las horas usan el formato de 24 horas, así que las 2 de la tarde son 14. Los nombres son las tres primeras letras del mes o del día en inglés, y no importa si van en mayúsculas o minúsculas. Algunas implementaciones, entre ellas el cron de macOS, no aceptan nombres dentro de rangos o listas, por lo que 1-5 es más portable que mon-fri.
En un archivo crontab, el comando va después de los cinco campos: 0 2 * * * /home/me/backup.sh. El archivo /etc/crontab de todo el sistema en Linux añade además un campo con el nombre de usuario antes del comando.
Caracteres especiales: asterisco, coma, guion y barra
Cuatro caracteres hacen casi todo el trabajo:
| Carácter | Significado | Ejemplo | Coincide con |
|---|---|---|---|
* |
Cualquier valor | * en el campo de horas |
Horas 0, 1, 2 … 23 |
, |
Lista | 8,20 en el campo de horas |
Horas 8 y 20 |
- |
Rango (inclusivo) | 1-5 en el día de la semana |
De lunes a viernes |
/ |
Intervalo | */15 en el campo de minutos |
Minutos 0, 15, 30, 45 |
Se pueden combinar. 9-17/2 en el campo de horas coincide con 9, 11, 13, 15 y 17, y 0-4,8-12 es una lista de dos rangos.
Los intervalos vuelven a empezar en cada ciclo. */7 en el campo de minutos coincide con 0, 7, 14 … 56 y de nuevo con 0 al empezar la hora siguiente, así que entre :56 y :00 pasan cuatro minutos, no siete. Un intervalo que no divide exactamente 60 minutos o 24 horas nunca da una frecuencia totalmente regular.
15 ejemplos de expresiones cron
Cada ejemplo se comprobó campo por campo. Las horas corresponden a la zona horaria del programador.
| Expresión cron | Cuándo se ejecuta |
|---|---|
* * * * * |
Cada minuto |
*/5 * * * * |
Cada 5 minutos (:00, :05, :10 …) |
30 * * * * |
Cada hora a y media (00:30, 01:30 …) |
0 */2 * * * |
Cada 2 horas en punto (00:00, 02:00 … 22:00) |
0 2 * * * |
Todos los días a las 02:00 |
0 8,20 * * * |
Dos veces al día, a las 08:00 y a las 20:00 |
0 9 * * 1-5 |
De lunes a viernes a las 09:00 |
*/15 9-17 * * 1-5 |
Cada 15 minutos de 09:00 a 17:45, de lunes a viernes |
0 6 * * 0,6 |
Sábados y domingos a las 06:00 |
0 0 * * 0 |
Todos los domingos a medianoche |
0 22 * * 5 |
Todos los viernes a las 22:00 |
0 0 1 * * |
El día 1 de cada mes a medianoche |
0 12 15 * * |
El día 15 de cada mes a las 12:00 |
0 0 1 1,4,7,10 * |
Cada trimestre: el 1 de enero, abril, julio y octubre a medianoche |
0 0 1 1 * |
Una vez al año, el 1 de enero a medianoche |
Hay dos detalles que se pasan por alto con facilidad. Primero, los rangos incluyen ambos extremos, así que 9-17 incluye la hora 17: */15 9-17 * * 1-5 se ejecuta 36 veces al día y la última ejecución es a las 17:45, no a las 17:00. Segundo, 0 0 1 */3 * da la misma programación trimestral, porque */3 en el campo del mes empieza en 1 y coincide con los meses 1, 4, 7 y 10.
Macros no estándar: @daily, @weekly y @reboot
Muchas implementaciones de cron aceptan una palabra clave en lugar de los cinco campos:
| Macro | Equivale a | Se ejecuta |
|---|---|---|
@yearly o @annually |
0 0 1 1 * |
A medianoche del 1 de enero |
@monthly |
0 0 1 * * |
A medianoche del día 1 de cada mes |
@weekly |
0 0 * * 0 |
El domingo a medianoche |
@daily o @midnight |
0 0 * * * |
Todos los días a medianoche |
@hourly |
0 * * * * |
En el minuto 0 de cada hora |
@reboot |
– | Una vez, cuando se inicia el demonio de cron |
Vixie cron, cronie y el cron de macOS admiten todas, y los CronJobs de Kubernetes aceptan las basadas en tiempo, pero no @reboot. No forman parte del estándar POSIX, así que consulta la documentación antes de usarlas en otros sistemas.
Variantes de cron: segundos, años y caracteres adicionales
No todos los programadores leen cinco campos, así que comprueba para qué dialecto escribes.
- Quartz (Java) usa seis o siete campos: segundos, minutos, horas, día del mes, mes, día de la semana y un año opcional. Uno de los dos campos de día debe ser
?(«sin valor concreto»). Quartz también admiteL(último),W(día laborable más cercano) y#(enésimo día de la semana del mes):0 15 10 L * ?se ejecuta a las 10:15 el último día de cada mes, y0 15 10 ? * 6#3a las 10:15 el tercer viernes, porque Quartz numera los días de la semana del 1 al 7 empezando por el domingo. - Las expresiones de Spring en
@Scheduled(cron = "…")tienen seis campos: primero los segundos y después los cinco habituales, sin año. - Las reglas de AWS EventBridge usan
cron(minutes hours day-of-month month day-of-week year): seis campos, sin segundos, un año al final y un?en uno de los dos campos de día.cron(0 12 * * ? *)se ejecuta todos los días a las 12:00 UTC. Las reglas de un bus de eventos funcionan en UTC, mientras que EventBridge Scheduler permite elegir una zona horaria. Igual que Quartz, AWS numera los días de la semana del 1 al 7, con 1 = domingo. - Los CronJobs de Kubernetes usan los cinco campos estándar en
spec.schedule. Sinspec.timeZone, la programación sigue la zona horaria del kube-controller-manager. Asígnale un nombre IANA comoEurope/Berlinpara fijarla. - Los disparadores
schedulede GitHub Actions usan cinco campos y se ejecutan en UTC, salvo que indique una zona horaria IANA opcional. El intervalo más corto admitido es de cinco minutos, no se admiten macros como@daily, y las ejecuciones programadas pueden retrasarse cuando GitHub tiene mucha carga, sobre todo al comienzo de cada hora.
La trampa del día del mes y el día de la semana
En el cron estándar (Vixie), los dos campos de día se combinan con O, no con Y, cuando ambos están restringidos. Si uno de ellos es *, solo cuenta el otro. Por eso 0 9 1-7 * 1 no significa «el primer lunes del mes». Se ejecuta a las 09:00 cada uno de los días del 1 al 7 y además todos los lunes, lo que suma 10 u 11 ejecuciones al mes.
Para que se ejecute solo el primer lunes, deja un campo de día en la expresión y comprueba el otro en el comando:
0 9 1-7 * * [ "$(date +\%u)" = 1 ] && /path/to/report.sh
date +%u muestra el día de la semana como un número del 1 al 7, con lunes = 1. El signo de porcentaje debe escaparse como \%, porque cron convierte un % sin escapar del comando en un salto de línea. Quartz y AWS evitan esta ambigüedad al exigir ? en uno de los dos campos de día.
Zonas horarias y horario de verano
Cron funciona en la zona horaria de la máquina o del servicio que evalúa la expresión, que en servidores y plataformas en la nube suele ser UTC, no tu hora local. 0 9 * * * en un servidor en UTC se ejecuta a las 09:00 UTC, que son las 05:00 en Nueva York durante el horario de verano (UTC−4). El conversor de zonas horarias te ayuda a pasar una hora local a la zona del programador.
El horario de verano añade dos casos límite en las zonas que lo aplican: cuando se adelantan los relojes, una hora local no existe, y cuando se atrasan, una hora ocurre dos veces. El cron de Debian y cronie compensan los cambios pequeños de reloj en los trabajos con hora fija: una ejecución que cae en la hora omitida se realiza poco después del cambio, y una ejecución en la hora repetida no se repite. Otros programadores se comportan de otra forma, así que lo más seguro es usar UTC en los servidores o mantener los trabajos importantes fuera de las horas en que cambian los relojes, normalmente entre la 01:00 y las 03:00 hora local.
Cómo probar una expresión cron
Una expresión cron incorrecta rara vez produce un error: el trabajo simplemente se ejecuta a la hora equivocada o nunca. Una rutina breve detecta la mayoría de los problemas:
- Léela con palabras. Pega la expresión en una herramienta que la describa y comprueba que la frase coincide con lo que querías, sobre todo en los dos campos de día.
- Prueba el comando con una programación corta. Usa
* * * * *de forma temporal para que el trabajo se ejecute en menos de un minuto y luego cambia a la programación real. - Guarda la salida. Añade
>> /tmp/myjob.log 2>&1después del comando para que los errores se escriban en un archivo en lugar de perderse. - Revisa el registro de cron. Usa
grep CRON /var/log/syslogojournalctl -u cronen Debian y Ubuntu, yjournalctl -u cronden Fedora y RHEL. - Usa rutas absolutas. Cron inicia los trabajos con un entorno mínimo y un
PATHcorto, así que un comando que funciona en tu terminal puede fallar en cron.
Crea una con el generador de Crontab
El generador de Crontab gratuito funciona por completo en tu navegador. Escribe una expresión o haz clic en un ajuste rápido como «Cada 15 min», «Diario a las 2 a. m.» o «Cada lunes», y la herramienta:
- valida la sintaxis y te avisa cuando una expresión no es válida;
- describe la programación con palabras sencillas (en inglés);
- acepta los cinco campos estándar, un campo opcional de segundos al principio, nombres de meses y días de la semana, y 7 para el domingo;
- convierte macros como
@weeklyen su equivalente de cinco campos y explica qué hace@reboot; - muestra una tabla de referencia con cada símbolo y un ejemplo.
Los interruptores permiten obtener una descripción más detallada, usar el formato de 24 horas y decidir si los números de los días de la semana empiezan en 0 para el domingo. No acepta caracteres exclusivos de Quartz (L, W, #) ni un campo de año. La herramienta solo crea y comprueba la expresión; para programar el trabajo, cópiala en crontab -e o en la configuración de tu plataforma.
Preguntas frecuentes
¿Qué diferencia hay entre cron y crontab?
Cron es el servicio en segundo plano (demonio) que ejecuta los trabajos programados. Un crontab, abreviatura de «cron table», es el archivo que los enumera, un trabajo por línea: una expresión cron seguida de un comando. Tu propio crontab se edita con crontab -e y se muestra con crontab -l.
¿Puede un trabajo cron ejecutarse cada 30 segundos?
No en el cron estándar, cuya unidad mínima es un minuto. Los programadores con campo de segundos sí pueden: Spring acepta */30 * * * * *, y Quartz necesita un ? en un campo de día, como en */30 * * * * ?. Con el cron clásico, una solución habitual son dos líneas que se ejecutan cada minuto, una de ellas con sleep 30; antes del comando.
¿Cómo ejecuto un trabajo cron el último día del mes?
El cron estándar no tiene un símbolo para «último día», pero Quartz y AWS admiten L en el campo del día del mes. En el cron clásico, programa los días del 28 al 31 y deja que el comando compruebe si mañana es día 1:
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job.sh
date -d tomorrow es sintaxis de GNU date, la que se usa en Linux. En macOS, usa date -v+1d en su lugar.
Pruébalo gratis: Generador de Crontab Gratis y sin necesidad de cuenta.