Ejemplos de expresiones cron para Linux y Unix
Guía con ejemplos de expresiones cron para Linux y Unix: cada 5 minutos, cada hora, días laborables, mensual y más.
Qué es cron y para qué sirve
cron es el planificador clásico de tareas en sistemas Unix y Linux. Lee un archivo de configuración (la crontab) donde cada línea contiene una expresión de tiempo y un comando a ejecutar. Cuando la fecha y hora del sistema encajan con la expresión, el comando se lanza.
Esta guía usa el formato cron Unix/POSIX de cinco campos: minuto, hora, día del mes, mes y día de la semana. No incluye campo de segundos. No es compatible con dialectos extendidos como Quartz, que añade segundos y opciones específicas.
Cómo leer una expresión cron
Una expresión cron es una secuencia de cinco campos separados por espacios. Cada campo controla una unidad de tiempo. Si todos los campos encajan con la fecha actual, el comando se ejecuta.
┌──────── minuto (0-59) │ ┌────── hora (0-23) │ │ ┌──── día del mes (1-31) │ │ │ ┌── mes (1-12) │ │ │ │ ┌ día semana (0-7; 0 y 7 = domingo) │ │ │ │ │ * * * * * comando a ejecutar
Campos de cron en detalle
- Minuto: 0–59.
- Hora: 0–23 (formato 24h).
- Día del mes: 1–31.
- Mes: 1–12 (también se aceptan nombres como JAN, FEB, ...).
- Día de la semana: 0–7, donde 0 y 7 son domingo (algunas implementaciones aceptan SUN, MON, ...).
Diferencia entre *, */n, rangos y listas
*- cualquier valor del campo.*/n- cada n unidades. Ejemplo:*/5en minutos = 0, 5, 10, 15, ...a-b- rango inclusivo. Ejemplo:9-17en horas = 9, 10, ..., 17.a,b,c- lista explícita. Ejemplo:1,15en día del mes = 1 y 15.
Cron y timezone: UTC frente a hora local
Cron no tiene un concepto de timezone propio: evalúa la expresión en la timezone del proceso que lo lanza. En la práctica eso significa que la misma línea de crontab puede dispararse a horas distintas según dónde corra. Si tu equipo tiene gente en diferentes regiones, decide explícitamente en qué timezone se interpreta el schedule y déjalo documentado.
Comprueba las próximas ejecuciones en la timezone que te interesa y también en UTC con el generador de cron: el selector de timezone te muestra las dos columnas en paralelo y avisa cuando un cambio de horario afecta a alguna ejecución.
Cambios de horario (DST)
En timezones con horario de verano, cada año hay dos transiciones. En la transición de marzo (spring forward) se salta una hora local: un cron 30 2 * * * ese día no se ejecuta en Europe/Madrid porque las 02:30 locales no existen. En la transición de octubre (fall back) la hora local se repite: 30 2 * * * se ejecuta dos veces, una en cada offset.
Cómo lo interpreta cada ejecutor
- system cron (
/etc/crontab): hereda la timezone del sistema. Para fijarla, declaraTZ=Region/Ciudaden la propia crontab antes de la línea. - Docker: el contenedor suele estar en UTC salvo que pases
TZ=Region/Ciudado montes/etc/localtime. - Kubernetes CronJob:
spec.schedulese interpreta segúnspec.timeZonecuando ese campo está presente (estable en versiones modernas). Si lo omites, el schedule depende de la timezone local delkube-controller-manager, NO de UTC garantizado. - GitHub Actions: los
on.schedule.cronse ejecutan en UTC siempre. No hay opción para cambiarlo. - Cloudflare Scheduled Workers: también UTC. No hay selector de timezone en
wrangler.toml.
Errores frecuentes
- Usar 6 o 7 campos al copiar una expresión Quartz. En cron Unix son 5.
- Asumir AND entre día del mes y día de la semana. La mayoría de implementaciones usan OR.
- Olvidar la zona horaria. Cron evalúa con el TZ del proceso, no UTC.
- No redirigir la salida. Si el comando imprime, cron envía el output por correo del sistema.
- Permisos: si el comando es un script, debe tener bit de ejecución y ruta absoluta.
Cron en Linux frente a Quartz y otros formatos
El cron clásico de Unix/Linux trabaja con 5 campos y resolución de minuto. Quartz, usado en aplicaciones Java y Spring, añade un campo de segundos (y opcionalmente uno de año), aceptando 6 o 7 campos. Los caracteres como L, W o # son extensiones de Quartz y no están disponibles en cron POSIX. Si copias una expresión entre sistemas, valida primero el número de campos.
Tabla de ejemplos comunes
Copia cualquier expresión y pégala en el generador para ver las próximas ejecuciones.
| Expresión | Significado | Caso de uso |
|---|---|---|
| * * * * * | Cada minuto | Monitorización en desarrollo o smoke tests. |
| */5 * * * * | Cada 5 minutos | Sondeo de un servicio o sincronización ligera. |
| 0 * * * * | Cada hora en punto | Rotación de logs o limpieza de caché horaria. |
| 0 9 * * * | Cada día a las 09:00 | Resumen diario por email. |
| 0 9 * * 1-5 | De lunes a viernes a las 09:00 | Tareas solo en días laborables. |
| 0 0 * * 0 | Cada domingo a medianoche | Mantenimiento semanal fuera de horario. |
| 0 0 1 * * | El día 1 de cada mes a medianoche | Facturación mensual o cierres contables. |
| 0 0 1 1 * | El 1 de enero a medianoche | Reset anual de contadores. |
| */15 9-17 * * 1-5 | Cada 15 minutos en horario laboral | Comprobaciones frecuentes solo en jornada. |
| 0 2 * * * | Todos los días a las 02:00 | Backups nocturnos. |
Siguientes pasos
Si el cron ejecuta un script, revisa también los permisos con la calculadora chmod. Asegúrate de que el archivo es ejecutable (chmod +x script.sh) antes de programar la tarea.
Preguntas frecuentes
- ¿Qué formato de cron usa esta guía?
- Formato Unix/POSIX de cinco campos: minuto, hora, día del mes, mes y día de la semana. Sin campo de segundos. No es el formato Quartz utilizado por Spring o algunos schedulers Java.
- ¿Qué pasa si combino día del mes y día de la semana?
- En la mayoría de implementaciones Unix/POSIX se aplica una semántica OR: la tarea se ejecuta cuando coincide CUALQUIERA de los dos campos. Por ejemplo, `0 0 1 * 1` ejecuta el día 1 de cada mes O cada lunes, no solo cuando un lunes cae en día 1.
- ¿En qué zona horaria se evalúa la expresión?
- Cron evalúa la expresión en la zona horaria del proceso que lo ejecuta (típicamente la del sistema). Si necesitas otra zona, ajusta la variable TZ del entorno o usa un wrapper que la fije antes del comando.
- ¿Qué significa `*/n`?
- El operador `*/n` significa cada `n` unidades dentro del rango del campo. Por ejemplo, `*/15` en el campo de minutos equivale a `0,15,30,45`.
- ¿Cuál es el error más típico al escribir una expresión?
- Confundir el día de la semana (0 = domingo en la mayoría de implementaciones Unix) o asumir que `0 0 1 * 1` significa AND. También usar 7 campos al copiar expresiones Quartz; en Unix solo hay 5.