Cron es el programador de tareas de los sistemas Unix, y su sintaxis se ha colado en todas partes: servidores Linux, Kubernetes, GitHub Actions, funciones serverless, Laravel, Spring… Aprenderla cuesta diez minutos. Olvidarla, bastante menos. Esta chuleta está pensada para tenerla a mano.
Los cinco campos
Una expresión cron clásica tiene cinco campos separados por espacios:
┌───────────── minuto (0–59)
│ ┌─────────── hora (0–23)
│ │ ┌───────── día del mes (1–31)
│ │ │ ┌─────── mes (1–12 o JAN–DEC)
│ │ │ │ ┌───── día de la semana (0–7 o SUN–SAT; 0 y 7 son domingo)
│ │ │ │ │
* * * * * comando
Cada campo acepta estos operadores:
| Símbolo | Significa | Ejemplo | Se lee |
|---|---|---|---|
* |
cualquier valor | * * * * * |
cada minuto |
, |
lista | 0 9,14 * * * |
a las 9:00 y a las 14:00 |
- |
rango | 0 9-17 * * * |
cada hora en punto, de 9 a 17 h |
/ |
paso | */15 * * * * |
cada 15 minutos |
20 ejemplos que vas a necesitar
| Expresión | Cuándo se ejecuta |
|---|---|
* * * * * |
Cada minuto |
*/5 * * * * |
Cada 5 minutos |
*/15 * * * * |
Cada 15 minutos (:00, :15, :30, :45) |
0 * * * * |
Cada hora, en punto |
30 * * * * |
Cada hora, a y media |
0 */2 * * * |
Cada 2 horas |
0 0 * * * |
Todos los días a medianoche |
0 8 * * * |
Todos los días a las 8:00 |
30 23 * * * |
Todos los días a las 23:30 |
0 9 * * 1-5 |
De lunes a viernes a las 9:00 |
0 10 * * 6,0 |
Sábados y domingos a las 10:00 |
0 9-18 * * 1-5 |
Cada hora de 9 a 18, en días laborables |
0 0 * * 0 |
Cada domingo a medianoche |
0 0 1 * * |
El día 1 de cada mes |
0 0 15 * * |
El día 15 de cada mes |
0 0 1 1 * |
El 1 de enero (una vez al año) |
0 0 1 */3 * |
El primer día de cada trimestre |
0 3 * * 1 |
Los lunes a las 3:00 (típico para backups) |
*/10 8-20 * * * |
Cada 10 minutos entre las 8:00 y las 20:59 |
0 12 1-7 * 1 |
⚠️ No es «el primer lunes del mes» (ver abajo) |
Si tienes dudas con una expresión concreta, pégala en el analizador de cron: te muestra las próximas fechas en las que se ejecutará. Y si prefieres construirla sin escribir la sintaxis, el generador de cron lo hace con selectores y te la explica en lenguaje natural.
Los atajos con @
El cron de Linux (y la mayoría de sus derivados) acepta alias legibles; GitHub Actions y otros programadores en la nube, no:
| Alias | Equivale a |
|---|---|
@yearly o @annually |
0 0 1 1 * |
@monthly |
0 0 1 * * |
@weekly |
0 0 * * 0 |
@daily o @midnight |
0 0 * * * |
@hourly |
0 * * * * |
@reboot |
Al arrancar el sistema |
Los 5 errores que más tareas rompen
1. Día del mes y día de la semana se combinan con «O», no con «Y»
Es la trampa más famosa. En el cron clásico, si restringes a la vez el día del mes y el día de la semana, la tarea se ejecuta cuando se cumple cualquiera de los dos. Así, 0 12 1-7 * 1 no significa «el primer lunes del mes a las 12», sino «los días 1 a 7 de cada mes y además todos los lunes».
La solución habitual es dejar solo uno de los dos campos y filtrar en el propio comando:
0 12 1-7 * * [ "$(date +\%u)" = 1 ] && /ruta/script.sh
(En un crontab, el % hay que escaparlo como \%: sin la barra, cron lo interpreta como un salto de línea.)
2. La zona horaria no es la que crees
Cron usa la zona horaria del sistema donde corre. En un servidor configurado en UTC, 0 9 * * * se ejecuta a las 9:00 UTC, que en España son las 10:00 en invierno y las 11:00 en verano. Los programadores gestionados suelen ir en UTC: GitHub Actions siempre usa UTC, y en Kubernetes los CronJob usan la zona del controlador salvo que indiques timeZone en la especificación.
3. El cambio de hora
Si programas algo entre las 2:00 y las 3:00 de la madrugada, el día del cambio de hora puede saltarse (en primavera esa hora no existe) o, según la implementación, ejecutarse dos veces (en otoño se repite). Para tareas críticas, evita esa franja o trabaja en UTC.
4. Los pasos no cruzan de hora
*/7 * * * * no se ejecuta «cada 7 minutos» en sentido estricto: se ejecuta en los minutos 0, 7, 14… 56, y en la hora siguiente vuelve a empezar en 0. Entre el minuto 56 y el 0 solo pasan 4 minutos. Para intervalos que no dividen 60, cron no es la herramienta adecuada.
5. Cinco campos o seis
Cron clásico tiene cinco campos y resolución de un minuto. Quartz, Spring (@Scheduled) y librerías como node-cron añaden un sexto campo al principio para los segundos: 0 */5 * * * * es «cada 5 minutos» en Spring, pero una expresión inválida en un crontab. Si copias una expresión de un sistema a otro, cuenta los campos.
Cómo comprobar una expresión antes de desplegar
El método más fiable es ver las próximas ejecuciones reales. Pega la expresión en el analizador de cron, elige 5 o 6 campos según tu sistema y revisa la lista de fechas: si ves que tu «primer lunes de mes» se ejecuta también el día 3, has caído en el error número 1. Todo se calcula en tu navegador, así que puedes probar tantas expresiones como quieras.

