Herramientas para Desarrolladores
February 14, 20267 min readBy BrowseryTools Team

Expresiones cron explicadas: cómo leer y escribir programaciones cron

La sintaxis cron es críptica hasta que entiendes los cinco campos. Aprende a leer y escribir expresiones cron, evitar errores comunes y analizar cualquier programación al instante en tu navegador.

cronexpresión cronprogramador de tareasDevOpsautomatizaciónLinux

Si alguna vez has desplegado una aplicación web, configurado un pipeline de CI/CD o administrado un servidor Linux, casi con toda seguridad te has topado con una expresión cron. Cinco asteriscos mirándote desde un archivo de configuración. Una cadena críptica como 0 2 * * 0 enterrada en un workflow de GitHub Actions. Una programación de AWS EventBridge que ya nadie del equipo entiende del todo. Las expresiones cron están por todas partes — y son realmente confusas si no te has tomado el tiempo de aprender el sistema que hay detrás.

Esta guía es la referencia que deberías guardar en marcadores. Cubre todo, desde la historia de cron y dónde aparece en la infraestructura moderna, hasta cada carácter especial, 10 ejemplos reales anotados, errores comunes y una tabla de referencia completa. Al final, serás capaz de leer cualquier expresión cron de un vistazo y escribir otras nuevas con confianza.

¿Qué es cron?

Cron es un programador de tareas basado en Unix que ejecuta comandos o scripts automáticamente en momentos e intervalos específicos. El nombre viene de Chronos, la personificación griega del tiempo — una elección acertada para una herramienta cuyo propósito entero es la automatización basada en el tiempo. El cron original se introdujo en la versión 7 de Unix en 1979, escrito por Ken Thompson en los Laboratorios Bell, y ha sido un elemento básico de los sistemas operativos tipo Unix desde entonces.

El programador funciona leyendo archivos de configuración llamados crontabs (tablas cron) — archivos de texto plano donde cada línea define una tarea programada. Un proceso demonio en segundo plano (crond) se activa cada minuto, comprueba todos los crontabs activos y ejecuta cualquier tarea cuya programación coincida con la hora actual. Es un diseño bellamente simple que ha permanecido fundamentalmente inalterado durante más de cuatro décadas.

Dónde te encuentras cron hoy

Cron no es solo una reliquia del pasado de Unix. La sintaxis de las expresiones cron es el estándar de facto para expresar programaciones recurrentes en toda la pila de software moderna:

  • Crontab de Linux y macOS: el caso de uso original. Ejecuta crontab -e en cualquier máquina Linux o macOS para editar tu programación cron personal.
  • GitHub Actions: los archivos de workflow usan la sintaxis cron bajo el disparadorschedule: para ejecutar pipelines de CI/CD de forma recurrente.
  • AWS EventBridge (antes CloudWatch Events): dispara funciones Lambda, tareas ECS y otros servicios de AWS según una programación usando una variante cron de 6 campos.
  • CronJobs de Kubernetes: el recurso CronJob ejecuta cargas de trabajo por lotes dentro de un clúster según una programación cron.
  • Pipelines de CI/CD: GitLab CI, CircleCI, Jenkins y Bitbucket Pipelines admiten ejecuciones programadas usando expresiones cron.
  • Vercel y Netlify: ambas plataformas admiten funciones serverless disparadas por cron para tareas como invalidación de caché, obtención de datos y compilaciones nocturnas.
  • Mantenimiento de bases de datos: la extensión pg_cron de PostgreSQL, el Event Scheduler de MySQL y los servicios de bases de datos gestionadas usan la sintaxis cron para tareas de vacuum, indexación y copias de seguridad.
  • Programadores a nivel de aplicación: librerías como node-cron, APScheduler (Python), Quartz (Java) y Sidekiq (Ruby) usan expresiones cron para definir tareas recurrentes en segundo plano.

En resumen: si trabajas en cualquier área del desarrollo de software o la administración de sistemas, las expresiones cron son algo con lo que te encontrarás con regularidad. Aprenderlas una vez da dividendos en todas partes.

La estructura de cinco campos

Una expresión cron estándar consta de exactamente cinco campos separados por espacios, cada uno representando una unidad de tiempo. Juntos, definen cuándo debe ejecutarse una tarea. Aquí tienes la representación visual canónica:

┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12)
│ │ │ │ ┌───── day of week (0–7)
│ │ │ │ │
* * * * *

Leyendo de izquierda a derecha: minuto, hora, día del mes, mes, día de la semana. Un asterisco (*) en cualquier campo significa "todos los valores posibles para este campo". Así que * * * * *significa "cada minuto de cada hora de cada día" — la programación más permisiva posible.

Campo 1: minuto (0–59)

El campo de minuto controla en qué minuto(s) dentro de una hora se dispara una tarea. Un valor de 0significa en punto, 30 significa a la media hora y * significa cada minuto. Este es el campo más granular del cron estándar — la unidad de programación más pequeña es un minuto.

Campo 2: hora (0–23)

El campo de hora usa el formato de 24 horas. 0 es medianoche, 9 son las 9 de la mañana, 17 son las 5 de la tarde y 23 son las 11 de la noche. No hay AM/PM — todo está en formato de 24 horas. Recuerda que cron siempre se ejecuta en la zona horaria del servidor a menos que se configure explícitamente de otra manera.

Campo 3: día del mes (1–31)

Controla en qué día(s) del mes se ejecuta una tarea. 1 es el primero, 15 es el día quince, 31 es el treinta y uno. Ten cuidado con valores como 31 — en meses con menos días (febrero, abril, junio, etc.), una tarea programada para el día 31 simplemente no se ejecutará ese mes. Algunas implementaciones admiten el carácter especial L para significar "último día del mes" sin importar cuántos días tenga el mes.

Campo 4: mes (1–12)

El campo de mes usa valores numéricos (1 para enero hasta 12 para diciembre) o abreviaturas de tres letras (JAN, FEB, MAR, APR, MAY, JUN,JUL, AUG, SEP, OCT, NOV, DEC) en la mayoría de las implementaciones. Un asterisco significa "cada mes".

Campo 5: día de la semana (0–7)

Este campo especifica en qué día(s) de la semana debe ejecutarse la tarea. La numeración aquí es una fuente común de confusión: tanto 0 como 7 representan el domingo en la mayoría de las implementaciones de cron (una peculiaridad heredada del diseño original de Unix). El lunes es 1, el martes es 2 y el sábado es 6. Las abreviaturas de tres letras (SUN, MON, TUE, WED, THU, FRI,SAT) son compatibles con la mayoría de las herramientas cron modernas.

Importante: cuando se especifican tanto el día del mes como el día de la semana (no*), la mayoría de las implementaciones de cron los tratan como una condición OR — la tarea se ejecuta si cualquiera de las condiciones coincide. Este es un comportamiento sutil pero crítico que pilla desprevenidos a muchos desarrolladores.

Caracteres especiales

El verdadero poder de las expresiones cron viene de seis caracteres especiales que te permiten expresar programaciones complejas de forma concisa. Entenderlos es la clave para dominarlas.

* — Comodín (cada valor)

Un asterisco significa "coincide con todos los valores posibles de este campo". En el campo de minuto,* significa cada minuto (del 0 al 59). En el campo de mes, significa cada mes. Es el valor predeterminado de "no me importa este campo".

* * * * *    # Runs every single minute, all day, every day

, — Lista (múltiples valores)

Una coma separa una lista de valores específicos. El campo coincide si la hora actual coincide con cualquier valor de la lista. Así es como programas una tarea para que se ejecute en varios momentos discretos sin usar un rango.

0 9,13,17 * * *    # Runs at 9:00 AM, 1:00 PM, and 5:00 PM every day
0 0 1,15 * *       # Runs at midnight on the 1st and 15th of every month

- — Rango (de hasta)

Un guion define un rango inclusivo de valores. El campo coincide con cada valor entre el inicio y el final, inclusive. Esto es ideal para expresar cosas como "durante el horario laboral" o "entre semana".

0 9-17 * * *      # Runs at the top of every hour from 9 AM through 5 PM
0 0 * * 1-5       # Runs at midnight every Monday through Friday

/ — Paso (cada N unidades)

Una barra inclinada define un valor de paso. */5 significa "cada 5 unidades empezando desde el mínimo". También puedes combinarlo con un rango: 0-30/10 significa "cada 10 unidades entre 0 y 30" (es decir, 0, 10, 20, 30). Los pasos son uno de los caracteres especiales más usados.

*/5 * * * *       # Every 5 minutes (0, 5, 10, 15, ... 55)
*/15 * * * *      # Every 15 minutes (0, 15, 30, 45)
0 */6 * * *       # Every 6 hours (0:00, 6:00, 12:00, 18:00)
0/15 * * * *      # Same as */15 — starts from 0, every 15 minutes

L — Último (solo algunas implementaciones)

El carácter L es compatible con algunas implementaciones de cron (en particular Quartz Scheduler en Java y algunas variantes de cron de Linux) para significar "último". En el campo de día del mes, Lsignifica el último día del mes actual — sea el 28, 29, 30 o 31. Resuelve el problema de programar tareas de "fin de mes" sin conocer de antemano la duración del mes.

0 0 L * *         # Midnight on the last day of every month (Quartz/some crons)

? — Sin valor específico (cron de Quartz/Java)

El signo de interrogación se usa en Quartz Scheduler (Java) y algunas otras herramientas cuando quieres especificar un día de la semana sin especificar también un día del mes, o viceversa. Como no tiene sentido lógico especificar ambos (digamos "el día 15 Y un miércoles"), uno de ellos debe establecerse en ?para indicar "no me importa". El cron estándar de Unix no usa este carácter — en su lugar usas *.

0 9 15 * ?        # Quartz: 9 AM on the 15th, day-of-week unspecified
0 9 ? * MON       # Quartz: 9 AM every Monday, day-of-month unspecified

10 ejemplos reales de cron

La mejor manera de afianzar tu comprensión es estudiar ejemplos reales con el contexto de por qué se eligió cada programación. Aquí tienes diez patrones con los que te encontrarás (y que usarás) con regularidad.

1. Cada día laborable a las 9:00

0 9 * * 1-5

El minuto es 0 (en punto), la hora es 9 (9 de la mañana), el día del mes y el mes son comodines, y el día de la semana es 1-5 (de lunes a viernes). Se usa para recordatorios de daily standup, correos de informes enviados al inicio del día laboral y tareas de sincronización de datos matutinas que no deberían ejecutarse en fin de semana.

2. Cada 15 minutos

*/15 * * * *

La sintaxis de paso */15 en el campo de minuto te da ejecuciones a los 0, 15, 30 y 45 minutos de cada hora, las 24 horas. Común para pings de comprobación de estado, precalentamiento de caché, reintentos de webhooks y cualquier tarea de sondeo casi en tiempo real donde necesitas frescura pero el tiempo real auténtico es excesivo o no está disponible.

3. Cada día a medianoche

0 0 * * *

Minuto 0, hora 0, todo lo demás comodín. Este es uno de los patrones cron más comunes que existen. Se usa para la generación de informes diarios, rotación de logs, archivado de bases de datos, limpieza de archivos temporales, envío de correos de resumen diario y cualquier tarea de "una vez al día" que deba ejecutarse fuera del horario laboral.

4. Primer día de cada mes a medianoche

0 0 1 * *

El día del mes es 1, todo lo demás es comodín (excepto el minuto/hora fijos). Esto se ejecuta el 1 de enero, el 1 de febrero, el 1 de marzo, etc. La programación de referencia para la generación de facturas mensuales, los disparadores de ciclos de facturación, las renovaciones de suscripciones SaaS y los resúmenes analíticos mensuales.

5. Cada domingo a las 2:00

0 2 * * 0

El día de la semana 0 es domingo, y la hora 2 son las 2 de la madrugada — un momento en que el tráfico suele estar en su nivel más bajo. Se usa para copias de seguridad completas semanales de la base de datos, regeneración del sitemap, reindexación de contenido para la búsqueda y trabajos pesados de procesamiento por lotes que afectarían al rendimiento durante la semana.

6. Días laborables a las 8:30, 12:30 y 17:30

30 8,12,17 * * 1-5

Esto combina una lista en el campo de hora con un rango en el campo de día de la semana. El minuto 30significa que se dispara en la marca de la media hora. Se usa para lotes de notificaciones programadas (notificaciones push, resúmenes por correo), tareas de sincronización de datos tres veces al día y cualquier flujo de trabajo donde quieras puntos de contacto regulares a lo largo del día laboral sin machacar cada hora.

7. 1 de enero a medianoche

0 0 1 1 *

El día del mes 1 y el mes 1 (enero) juntos fijan esto al Día de Año Nuevo. Se usa para tareas anuales como renovaciones de suscripciones anuales, archivado de los datos del año anterior, generación de informes de cumplimiento anuales y restablecimiento de cuotas o contadores anuales en las aplicaciones.

8. Cada 5 minutos durante el horario laboral entre semana

*/5 9-17 * * 1-5

Una expresión compuesta que combina un paso (*/5), un rango en horas (9-17) y un rango en el día de la semana (1-5). Esto te da una monitorización o sondeo agresivo — cada 5 minutos de 9 de la mañana a 5 de la tarde de lunes a viernes — mientras se mantiene en silencio por la noche y los fines de semana para ahorrar recursos y evitar la fatiga de alertas.

9. Cada 6 horas

0 */6 * * *

El paso en el campo de hora (*/6) da cuatro ejecuciones espaciadas uniformemente al día: medianoche, 6 de la mañana, mediodía y 6 de la tarde. Se usa para la sincronización de datos entre sistemas, la renovación de tokens de API o credenciales OAuth de larga duración antes de que expiren, y la invalidación periódica de caché para contenido que cambia unas pocas veces al día pero no necesita frescura a nivel de minuto.

10. Día 15 y último día de cada mes

0 0 15,L * *

Una lista con comas en el campo de día del mes que combina una fecha fija (15) y la abreviatura de último día (L). Esta es la clásica programación de nómina quincenal — periodos de pago que terminan el día 15 y el último día del mes. Ten en cuenta que L requiere una implementación que lo admita (Quartz, algunos crons de Linux); el crontab estándar no admite L.

Errores comunes y trampas

Las expresiones cron tienen varias trampas bien conocidas que provocan incidentes en producción. Entenderlas de antemano te ahorrará una dolorosa sesión de depuración a las 2 de la madrugada.

La numeración del día de la semana no es universal

La mayoría de las implementaciones de cron de Unix tratan tanto 0 como 7 como domingo. Pero algunas herramientas (incluidas ciertas librerías a nivel de aplicación) empiezan la semana en lunes, haciendo que 1 = lunes y 7 = domingo. Verifica siempre la convención de numeración de la herramienta específica que estás usando, y prefiere usar abreviaturas de tres letras (MON,TUE, etc.) cuando la implementación las admita para eliminar la ambigüedad.

Cron se ejecuta en la zona horaria del servidor

Esta es probablemente la fuente más común de errores de cron en producción. 0 9 * * * significa las 9 de la mañana en la zona horaria de la máquina que ejecuta la tarea — que puede ser UTC, US/Eastern o cualquier otra. Documenta siempre la suposición de zona horaria en un comentario junto a la expresión cron. Para los programadores en la nube, configura explícitamente la zona horaria si la plataforma lo admite.

# Good practice: always document the timezone
# Runs at 9 AM US/Eastern (UTC-5 or UTC-4 during DST)
0 14 * * 1-5   # 9 AM ET expressed in UTC

El cron de GitHub Actions siempre se ejecuta en UTC

GitHub Actions usa la sintaxis cron estándar de 5 campos bajo la clave on: schedule:, pero el programador siempre opera en UTC — no hay opción de configuración de zona horaria. Si quieres que una tarea se ejecute a las 9 de la mañana hora del Este, necesitas programarla en 0 14 * * * (UTC). Ten en cuenta también que los workflows programados de GitHub Actions pueden ejecutarse hasta 15 minutos tarde durante periodos de alta demanda.

La sintaxis de paso se aplica a su campo, no a los minutos

Una mala lectura común: */5 en el campo de hora significa cada 5 horas — no cada 5 minutos. El paso siempre se aplica a la unidad del campo en el que está. */5 en el campo de minuto es cada 5 minutos; en el campo de hora, cada 5 horas; en el campo de mes, cada 5 meses.

Las tareas que duran más que su intervalo pueden superponerse

Cron es un programador de "dispara y olvida". Si programas una tarea cada 5 minutos y una instancia de la tarea tarda 7 minutos en completarse, una segunda instancia se iniciará mientras la primera todavía se está ejecutando. Esto puede causar condiciones de carrera, procesamiento duplicado y corrupción de datos. Usa un bloqueo de archivo o un bloqueo consultivo en tu base de datos para evitar la ejecución concurrente de la misma tarea.

Los campos omitidos y los comodines no siempre son equivalentes

En algunas implementaciones extendidas de cron (en particular Quartz), omitir un campo y usar *se tratan de forma diferente. Usa siempre todos los campos requeridos de forma explícita y nunca confíes en los valores predeterminados para programaciones críticas de producción.

Extensiones no estándar: cron de 6 campos

El cron estándar de Unix tiene cinco campos, con el minuto como la granularidad más fina. Varios sistemas extienden esto con campos adicionales:

Campo de segundos (al principio)

Muchos programadores a nivel de aplicación (node-cron, Quartz, Spring Scheduler) añaden un campo de segundos al principio, dándote 6 campos. Esto permite una programación por debajo del minuto hasta el segundo. Los campos son: second minute hour day-of-month month day-of-week.

# 6-field cron with seconds prepended (Quartz / node-cron)
0 */5 * * * *    # Every 5 minutes (second=0, minute=*/5, ...)
30 0 9 * * 1-5   # Weekdays at 9:00:30 AM

AWS EventBridge (6 campos con año)

AWS EventBridge usa un formato de 6 campos donde se añade un campo de año al final:minute hour day-of-month month day-of-week year. También requiere usar ?para el día del mes o el día de la semana (nunca ambos como comodines a la vez). AWS EventBridge no admite la sintaxis de paso */ de la misma manera que el cron de Unix.

# AWS EventBridge cron format (6 fields, year at end)
cron(0 9 ? * MON-FRI *)    # Weekdays at 9 AM UTC, any year
cron(0 0 1 * ? *)           # First day of every month at midnight
Consejo rápido: al copiar una expresión cron entre plataformas, verifica siempre el número de campos y cualquier diferencia de sintaxis específica de la plataforma. Una expresión cron válida de Unix puede ser inválida (o significar algo diferente) en AWS EventBridge, Quartz o un contexto de node-cron.

Cómo usar el Analizador de cron de BrowseryTools

Escribir una expresión cron desde cero es una habilidad — validar que la escribiste correctamente es otra. ElAnalizador de cron de BrowseryTools hace que sea trivial verificar cualquier expresión antes de que se acerque a producción.

Pega cualquier expresión cron de 5 campos (o de 6 campos) en la herramienta y obtén al instante:

  • Una descripción legible para humanos de la programación ("Cada día laborable a las 9:00") para que puedas verificar de un vistazo que tu intención coincide con tu expresión.
  • Los próximos 5-10 momentos de ejecución programados listados explícitamente, para que veas exactamente cuándo se disparará la tarea y confirmes que no hay sorpresas.
  • Retroalimentación instantánea sobre sintaxis inválida — útil si tienes una errata o estás trabajando con una expresión que escribió otra persona.

Todo se ejecuta por completo en tu navegador — ninguna expresión se envía a ningún servidor. Es la forma más rápida de comprobar la cordura de una programación antes de desplegarla en GitHub Actions, Kubernetes o cualquier otra plataforma.

Tabla de referencia de expresiones cron

Usa esta tabla como referencia rápida. Guarda esta página en marcadores y vuelve a ella siempre que necesites consultar un patrón o verificar qué significa una expresión.

ExpresiónSignificado legibleCaso de uso típico
* * * * *Cada minutoSondeo de alta frecuencia, pruebas
*/5 * * * *Cada 5 minutosComprobaciones de estado, precalentamiento de caché
*/15 * * * *Cada 15 minutosSincronización de datos, reintentos de webhooks
0 * * * *Cada hora en puntoAgregaciones por hora, llamadas a API
0 */6 * * *Cada 6 horasRenovación de tokens, sincronización de datos
0 0 * * *Cada día a medianocheInformes diarios, rotación de logs
0 9 * * 1-5Días laborables a las 9:00Tareas en horario laboral, recordatorios
0 2 * * 0Cada domingo a las 2:00Copias de seguridad semanales, mantenimiento
0 0 1 * *El primero de cada mes a medianocheFacturas mensuales, facturación
0 0 1,15 * *Día 1 y 15 de cada mesNómina quincenal
0 0 1 1 *1 de enero a medianocheTareas anuales, reinicio anual
30 8,12,17 * * 1-5Días laborables a las 8:30, 12:30, 17:30Lotes de notificaciones
*/5 9-17 * * 1-5Cada 5 min en horario laboral (entre semana)Monitorización activa, sondeo

Valida tus expresiones cron antes de desplegar

Las expresiones cron son compactas y potentes, pero su concisión significa que una sola errata puede producir silenciosamente una programación completamente diferente. Una tarea que pretendías ejecutar mensualmente podría ejecutarse a diario. Una copia de seguridad que querías disparar cada domingo podría no ejecutarse nunca. El coste de una programación incorrecta en producción puede ir desde un informe perdido hasta una tarea de facturación que se dispara cientos de veces.

El hábito de dos minutos de pegar tu expresión en un validador y revisar los próximos momentos de ejecución programados antes de desplegar es una de las prácticas de mayor valor en DevOps e ingeniería de backend. Detecta los errores antes de que se conviertan en incidentes.

Valida cualquier expresión cron al instante — gratis, privado, en el navegador

Pega tu expresión, obtén una descripción legible para humanos y mira los próximos momentos de ejecución programados. Nada sale de tu navegador.

Abrir el Analizador de cron →

🛠️

Try the Tools — 100% Free, No Sign-Up

Everything runs in your browser. No uploads. No accounts. No ads.

Explore All Tools →