ToolsOps

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: */5 en minutos = 0, 5, 10, 15, ...
  • a-b - rango inclusivo. Ejemplo: 9-17 en horas = 9, 10, ..., 17.
  • a,b,c - lista explícita. Ejemplo: 1,15 en 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, declara TZ=Region/Ciudad en la propia crontab antes de la línea.
  • Docker: el contenedor suele estar en UTC salvo que pases TZ=Region/Ciudad o montes /etc/localtime.
  • Kubernetes CronJob: spec.schedule se interpreta según spec.timeZone cuando ese campo está presente (estable en versiones modernas). Si lo omites, el schedule depende de la timezone local del kube-controller-manager, NO de UTC garantizado.
  • GitHub Actions: los on.schedule.cron se 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ónSignificadoCaso de uso
* * * * *Cada minutoMonitorización en desarrollo o smoke tests.
*/5 * * * *Cada 5 minutosSondeo de un servicio o sincronización ligera.
0 * * * *Cada hora en puntoRotación de logs o limpieza de caché horaria.
0 9 * * *Cada día a las 09:00Resumen diario por email.
0 9 * * 1-5De lunes a viernes a las 09:00Tareas solo en días laborables.
0 0 * * 0Cada domingo a medianocheMantenimiento semanal fuera de horario.
0 0 1 * *El día 1 de cada mes a medianocheFacturación mensual o cierres contables.
0 0 1 1 *El 1 de enero a medianocheReset anual de contadores.
*/15 9-17 * * 1-5Cada 15 minutos en horario laboralComprobaciones frecuentes solo en jornada.
0 2 * * *Todos los días a las 02:00Backups nocturnos.

Usa el generador de cron

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.