Construir una expresión cron
- Panel
- Documentación
- API
¿Por qué un cron builder visual?
Una expresión cron ocupa cinco campos y, aun así, sigue siendo una de las mayores
generadoras de bugs en producción. ¿Cuántas veces un desarrollador ha escrito 0 0 * * 1 pensando «todos
los lunes», sin recordar que 1 puede significar domingo según las implementaciones? ¿Cuántas
veces se ha confundido */15 con 15? El cron builder responde a esta
necesidad: componer visualmente una expresión crontab, a partir de preajustes habituales o
de campos individuales, y obtener la expresión final lista para pegar en un crontab de Linux, un CronJob
de Kubernetes o un schedule de GitHub Actions.
La herramienta es la inversa de nuestro cron decoder: donde el converter toma una expresión y enumera las próximas ejecuciones, el builder toma elecciones humanas y produce la expresión cron correspondiente.
Cómo funciona
La interfaz gráfica propone dos modos de composición complementarios:
- Modo preajuste: un selector de frecuencia (every minute, every hour, every day, every week, every month, every year, custom) que genera inmediatamente una expresión cron válida.
- Modo campos: cinco campos editables (minuto, hora, día del mes, mes, día de la
semana) en los que se introduce libremente
*, un entero, un rango1-5, una lista1,15,30o un paso*/15.
El builder actualiza la expresión en tiempo real y muestra una lectura humana sucinta («todos los días a las 3 h», «cada 15 minutos») que sirve de salvaguarda: si la frase no encaja con su intención, la expresión probablemente sea incorrecta.
Los cinco campos cron, en claro
Una expresión cron estándar contiene cinco campos separados por espacios:
minute heure jour-du-mois mois jour-de-la-semaine
* * * * *
- minuto (0 a 59);
- hora (0 a 23);
- día del mes (1 a 31);
- mes (1 a 12 o abreviaturas Jan, Feb, etc.);
- día de la semana (0 a 7, donde 0 y 7 son ambos domingo en la mayoría de las implementaciones).
Cada campo admite varias formas: * (todos los valores), un entero preciso
(5), una lista (1,3,5), un rango (9-17), un paso (*/15
cada 15 valores) o una combinación (0-30/5).
Casos de uso típicos
- Desarrollador que aprende cron: visualizar cómo interactúa cada campo, sin arriesgar una expresión incorrecta en producción.
- Sysadmin con prisa: generar en pocos segundos un schedule para un cron de Linux, un CronJob de Kubernetes o un job de Ansible sin releer la man page.
- Desarrollador sin experiencia POSIX: producir una expresión crontab válida para Symfony Scheduler, Laravel Scheduler o node-cron sin conocer la sintaxis histórica.
- DevOps en revisión: prototipar rápidamente una expresión que proponer en una pull request y, después, validarla con el cron decoder.
- Migración legacy: reformular una expresión cron histórica pasando por el builder para asegurar la semántica antes de impulsarla a otro sitio.
Preajustes habituales
Seleccionar un preajuste sobrescribe los campos individuales y produce la expresión correspondiente:
- Cada minuto:
* * * * *. A evitar en producción salvo necesidad particular. - Cada hora:
0 * * * *. Al comienzo de cada hora. - Cada día:
0 0 * * *. A medianoche. - Cada semana:
0 0 * * 0. Todos los domingos a medianoche. - Cada mes:
0 0 1 * *. El día 1 del mes a medianoche. - Cada año:
0 0 1 1 *. El 1 de enero a medianoche.
Patrones habituales que conviene conocer
| Expresión | Lectura humana |
|---|---|
0 0 * * * |
Todos los días a medianoche |
*/15 * * * * |
Cada 15 minutos |
0 9 * * 1-5 |
Todos los días laborables a las 9 h |
0 0 1 * * |
El día 1 del mes a medianoche |
0 0 * * 0 |
Todos los domingos a medianoche |
*/5 9-17 * * 1-5 |
Cada 5 minutos en horas laborables |
0 3 * * * |
Todos los días a las 3 de la mañana |
30 2 1,15 * * |
El día 1 y el 15 del mes a las 2:30 |
Componer una expresión personalizada
Para casos más específicos, el asistente expone los cinco campos en entrada libre. Algunos ejemplos útiles:
- Todos los días a las 3 de la mañana: minute=
0, heure=3, otros campos*. - Cada 15 minutos: minute=
*/15, otros campos*. - De lunes a viernes a las 9 h: minute=
0, heure=9, jour-de-la-semaine=1-5. - Todos los días 1 y 15 del mes al mediodía: minute=
0, heure=12, jour-du-mois=1,15. - Cada 5 minutos entre las 9 h y las 17 h: minute=
*/5, heure=9-17.
Cómo utilizar el cron builder
- Elija un preajuste (every minute, every hour, every day, every week, every month, every year) que se corresponda con la base de su necesidad.
- Refine si es necesario editando directamente los cinco campos (minuto, hora, día del mes, mes, día de la semana).
- Lea la frase humana generada por la herramienta para confirmar la intención.
- Copie la expresión cron producida mediante el botón de copia.
- Valide el schedule con nuestro cron decoder, que calcula las próximas fechas de ejecución reales.
- Pegue la expresión en su crontab de Linux, su CronJob de Kubernetes, su Symfony Scheduler o su workflow de GitHub Actions.
Errores clásicos
- Día del mes y día de la semana combinados: si ninguno de los dos es
*, el comportamiento difiere según las implementaciones. Linux/Vixie cron aplica un OR; las librerías modernas a veces tienen un comportamiento distinto. A evitar. - ¿Día 1 = lunes o domingo?: según el país y la convención. La mayoría de cron Unix consideran domingo=0 y sábado=6. Compruebe su planificador.
- Zona horaria: un cron Unix utiliza por defecto la zona del servidor. Los planificadores aplicativos (Symfony Scheduler, Quartz) suelen permitir fijar una zona dedicada.
- Minuto que falta:
* * * * *ejecuta el job cada minuto, lo que raramente es lo deseado. Recuerde fijar un disparador preciso (0) para las tareas horarias.
Lectura humana y salida
Además de la expresión cron, la herramienta ofrece una lectura humana sucinta («todos los días a medianoche», «cada 5 minutos»). Es una salvaguarda: si la frase no se corresponde con su intención, la expresión probablemente sea incorrecta. Para un caso complejo, utilice después nuestro cron decoder para calcular las próximas fechas de ejecución reales.
Preguntas frecuentes
¿Puedo editar manualmente la expresión tras utilizar la interfaz?
Sí. El builder no es un modo exclusivo: los cinco campos siguen siendo editables en todo momento. Puede partir de un preajuste y, después, ajustar un campo a mano para obtener una expresión crontab a medida. La lectura humana se recalcula de inmediato.
¿La herramienta admite el formato Quartz de 6 campos (con segundos)?
No: el formato de 5 campos es el estándar Unix y la base común a la mayoría de los planificadores
(Linux crontab, Kubernetes CronJob, GitHub Actions, GitLab CI, Symfony Scheduler, Laravel Scheduler).
Quartz (Java) acepta un campo adicional para los segundos y símbolos específicos
(?, L, W, #), pero esa necesidad es poco frecuente.
¿Cómo se gestiona la zona horaria?
El builder produce una expresión cron neutra: es el motor que ejecuta el job el que aplica su
zona horaria. En un crontab de Linux, es la TZ del servidor. En GitHub Actions, es UTC. En
Kubernetes 1.27+, puede fijar spec.timeZone en el manifest. Symfony Scheduler y
Quartz exponen una zona dedicada por tarea.
¿Cómo valido mi expresión sin ejecutarla en producción?
Utilice nuestro cron decoder. Calcula las N próximas ejecuciones a partir del instante actual, sin arrancar ningún job. Es la mejor forma de confirmar que una expresión cron se dispara a la hora prevista antes de desplegarla.
¿Qué relación tiene con Symfony Scheduler?
Symfony Scheduler acepta las expresiones cron de 5 campos mediante Schedule::cron('0 3 * * *', ...)
. La expresión producida por el builder puede, por tanto, pegarse tal cual. Lo mismo ocurre con Laravel
Scheduler (->cron('...')), node-cron, Hangfire y Airflow.
¿Hay que prefijar el comando en el crontab del sistema?
Sí, en /etc/crontab hace falta un usuario (0 3 * * * www-data /usr/bin/php
...), mientras que crontab -e por usuario lo omite. La expresión en sí permanece
idéntica.
Ejemplo de solicitud
curl -X POST https://cdrn.fr/api/v1/tools/cron-builder/execute \
-H "Content-Type: application/json" \
-d '{"preset":"none","minute":"*","hour":"*","day_of_month":"*","month":"*","day_of_week":"*"}'
Esquema de entrada
| Campo | Tipo | Obligatorio | Por defecto |
|---|---|---|---|
preset |
choice (none, every_minute, hourly, daily, weekly, monthly, yearly) | – | none |
minute |
string | – | * |
hour |
string | – | * |
day_of_month |
string | – | * |
month |
string | – | * |
day_of_week |
string | – | * |
Puntos de acceso
GET https://cdrn.fr/api/v1/tools- lista todas las herramientas disponiblesGET https://cdrn.fr/api/v1/tools/cron-builder- recupera el esquema de esta herramientaPOST https://cdrn.fr/api/v1/tools/cron-builder/execute- ejecuta esta herramienta con un payload JSON