Calcular las próximas ejecuciones de una expresión cron

analiza y muestra las próximas fechas de ejecución de la configuración cron

¿Qué es una expresión cron?

Una expresión cron es una cadena corta que describe una recurrencia en el tiempo. El formato heredado de Unix ocupa cinco campos separados por espacios: minuto, hora, día del mes, mes y día de la semana. Esta sintaxis nació con el demonio cron de Brian Kernighan en los años 70 y, después, se generalizó con el Vixie cron (1987) adoptado por todas las distribuciones Linux y macOS modernas. Hoy en día, la misma sintaxis se encuentra en la mayoría de planificadores cloud (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) y CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── minute (0-59)
│ ┌── heure (0-23)
│ │ ┌── jour du mois (1-31)
│ │ │ ┌── mois (1-12 ou JAN-DEC)
│ │ │ │ ┌── jour de la semaine (0-7 ou SUN-SAT, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *

Una expresión cron bien formada define, por tanto, un cron schedule preciso: cada campo puede ser un valor fijo, un rango, una lista, un paso o un asterisco que coincide con todo. La compacidad de la expresión crontab es su fuerza, pero también es lo que hace que un cron decoder sea indispensable para validar visualmente la intención. Ese es todo el objetivo de este cron converter: producir una explicación cron legible, más la lista de las próximas ejecuciones.

Anatomía de una expresión cron

Los cinco campos comparten una gramática común. Estos son los límites aceptados por cada columna de una expresión crontab estándar:

  • Minuto: 0-59.
  • Hora: 0-23, formato 24 h.
  • Día del mes: 1-31.
  • Mes: 1-12 o las abreviaturas textuales JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Día de la semana: 0-7, donde 0 y 7 representan ambos al domingo, o las abreviaturas SUN, MON, TUE, WED, THU, FRI, SAT.

Caracteres especiales compartidos por los cinco campos:

  • *: any value, coincide con todos los valores autorizados del campo.
  • ,: lista discreta, por ejemplo 1,15,30 en el campo minuto.
  • -: rango inclusivo, por ejemplo 9-17 para las horas de oficina.
  • /: paso (step), por ejemplo */15 = cada 15 unidades, o 0-30/5 = cada 5 minutos entre 0 y 30.

Extensiones Quartz (Java, AWS EventBridge, Spring): la gramática sube a 6 o 7 campos con una columna segundos al inicio (0-59) y, a veces, una columna año al final (1970-2099). Quartz también introduce ? (no specific value, para desacoplar día-del-mes y día-de-la-semana), L (last: último día del mes, o último viernes con 5L), W (día laborable más cercano) y # (N-ésimo día de la semana del mes, por ejemplo 2#3 para el 3.er lunes). Una expresión Quartz no suele ser compatible con un crontab UNIX, y viceversa: es la principal fuente de error cuando se copia una expresión cron de una plataforma a otra.

# UNIX / Vixie cron (5 champs)
0 9 * * 1-5

# Quartz (6 champs avec secondes)
0 0 9 ? * MON-FRI

# Quartz (7 champs avec année)
0 0 9 ? * MON-FRI 2026

¿Por qué decodificar una expresión cron?

Leer 0 0 * * * es rápido. Leer */7 2-5 1,15 * 1-5 lo es claramente menos. Cuando una expresión se sale de lo trivial, el riesgo de error de interpretación aumenta y la cron decode se convierte en una etapa de revisión por derecho propio.

  • Depuración en producción: entender por qué una tarea se disparó a las 03:17 y no a las 03:00, o identificar un solapamiento entre dos jobs.
  • Code review: validar que un planificador enviado en pull request hace exactamente lo que el autor afirma, sin tener que memorizar la semántica de cada símbolo.
  • Auditoría de planificadores: repasar los cron jobs de Linux en /etc/crontab y /etc/cron.d/, los triggers de Jenkins, los spec.schedule de Kubernetes CronJob, las reglas AWS EventBridge y los jobs GCP Cloud Scheduler.
  • Migración legacy: retomar un /etc/crontab histórico sin documentación y reconstruir el mapa de tareas antes de un cambio de infraestructura.
  • Onboarding: permitir que un nuevo desarrollador relea una crontab sin tener que aprender de la noche a la mañana todos los caracteres especiales.

Cómo utilizar el cron decoder

El procedimiento para decodificar una expresión crontab con la herramienta:

  1. Pegue su expresión cron en el campo de entrada (5 campos separados por espacios).
  2. Indique el número de próximas ejecuciones que se deben calcular.
  3. Haga clic en convert para lanzar la cron decode: la herramienta devuelve una frase humana que explica el disparo, además de la lista fechada de las próximas ejecuciones.
  4. Compruebe visualmente que las fechas se corresponden con su intención (hora, día, frecuencia).
  5. Copie la salida mediante el botón de copia para pegarla en un ticket, una PR o una documentación técnica.

La herramienta no se contenta con un parsing sintáctico: proporciona una explicación cron en lenguaje natural, lo que la convierte a la vez en cron decoder y en validador de planning.

Ejemplos clásicos de expresión cron

Los patrones de a continuación cubren lo esencial de los cron schedules que aparecen en producción. Son todos válidos en Linux crontab, Kubernetes CronJob, GitHub Actions y en la mayoría de planificadores aplicativos.

Expresión Lectura humana
* * * * * Cada minuto
0 * * * * Cada hora en punto
0 0 * * * Todos los días a medianoche
0 0 * * 0 Todos los domingos a medianoche
*/15 * * * * Cada 15 minutos
0 9 * * 1-5 09:00 de lunes a viernes
0 0 1 * * El día 1 de cada mes a medianoche
0 0,12 * * * A medianoche y al mediodía todos los días
*/5 9-17 * * 1-5 Cada 5 minutos en horas laborables
30 2 1,15 * * El día 1 y el 15 del mes a las 2:30

Para ejecutar una tarea cron en un servidor Linux, se edita la crontab de usuario desde el shell:

# éditer la crontab de l'utilisateur courant
$ crontab -e

# lister les tâches existantes
$ crontab -l

# exemple de ligne ajoutée : sauvegarde quotidienne à 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Ejemplo de salida del cron converter para */5 * * * *:

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Preguntas frecuentes sobre el cron decoder

¿Qué diferencia hay entre cron UNIX y Quartz?

UNIX/Vixie cron utiliza 5 campos (minuto hasta día-de-la-semana), sin precisión al segundo, y no tiene una noción nativa de «último día del mes». Quartz (Java, Spring, AWS EventBridge) añade una columna segundos al inicio, a veces una columna año al final, y varios símbolos (?, L, W, #) ausentes de la crontab de Linux. Una expresión cron de Quartz a 6 campos no es, por tanto, directamente portable a /etc/crontab, y a la inversa. Nuestro cron decoder se centra en el formato de 5 campos, que cubre la mayoría de planificadores.

¿Cómo se ejecuta una tarea cron cada 5 minutos?

Con el paso / en el campo minuto:

*/5 * * * * /usr/local/bin/check-health.sh

Esta expresión crontab dispara el script en los minutos 0, 5, 10, 15... de cada hora, todos los días. Para limitar a las horas laborables de lunes a viernes, añada las restricciones sobre los campos hora y día-de-la-semana: */5 9-17 * * 1-5.

¿Qué significa el asterisco (*) en una expresión cron?

El asterisco significa any value: coincide con todos los valores autorizados del campo. En 0 0 * * *, las tres estrellas significan «cualquier día del mes, cualquier mes, cualquier día de la semana». Combinado con los dos primeros campos fijados a 0, se obtiene «todos los días a medianoche». La estrella también puede combinarse con un paso: */15 en minuto = cada 15 minutos.

¿Crontab tiene una zona horaria?

Por defecto, la zona del servidor. En un crontab de Linux, es la TZ del sistema (a menudo UTC en los VPS y los contenedores). GitHub Actions fuerza UTC. Kubernetes CronJob utiliza la zona del controlador, configurable mediante spec.timeZone desde la 1.27. AWS EventBridge evalúa las expresiones en UTC. Los planificadores aplicativos (Symfony Scheduler, Quartz, Airflow) suelen permitir fijar una zona dedicada a cada tarea. En caso de duda, compruebe date en el servidor de destino y compárelo con la salida del cron converter.

Cron job vs comando at: ¿cuál elegir?

cron sirve para ejecutar una tarea recurrente según una planificación. at sirve para ejecutar un comando una sola vez en un instante dado. Para una copia de seguridad diaria, una rotación de logs o una llamada de API regular, utilice cron. Para diferir una operación única («relanza este despliegue a las 22 h esta noche»), utilice at:

$ echo "/usr/local/bin/deploy.sh" | at 22:00
¿Cómo se prueba una expresión cron sin dispararla?

Ese es precisamente el papel de este cron converter: calcula las N próximas ejecuciones a partir del instante actual, sin arrancar ningún job. Verá inmediatamente si su expresión crontab se dispara a las 03:00 como estaba previsto o a las 03:17 por accidente. Para ir más allá antes de instalar la tarea, también puede probar el script solo (bash -x script.sh) y comprobar la sintaxis de un fichero crontab con crontab -T fichier en las distribuciones que lo admiten.

¿Qué ocurre si día-del-mes y día-de-la-semana están fijados a la vez?

En Vixie cron (Linux), la regla es un OR lógico: el job se dispara si uno o el otro de los dos campos coincide. Es contraintuitivo y fuente de bugs. Quartz utiliza un AND, de ahí la introducción del símbolo ? para señalar explícitamente «sin restricción». Por regla general, fije solamente uno de los dos campos.

Ejemplo de solicitud

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Esquema de entrada

Campo Tipo Obligatorio Por defecto
cron string
number_next_date integer

Puntos de acceso

  • GET https://cdrn.fr/api/v1/tools - lista todas las herramientas disponibles
  • GET https://cdrn.fr/api/v1/tools/cron-converter - recupera el esquema de esta herramienta
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - ejecuta esta herramienta con un payload JSON