Generador de expresiones Cron
Construye y comprende las programaciones de tareas cron de forma visual.
Preajustes rápidos
5 próximas ejecuciones
Referencia de sintaxis cron
* · cualquier valor
*/5 · cada 5 unidades
1,15 · en los valores 1 y 15
1-5 · rango de 1 a 5
Campos: minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12), día de la semana (0-6, 0=domingo)
Una breve historia de la expresión cron
La expresión cron de cinco campos data de mayo de 1975, cuando una versión temprana se envió desde los AT&T Bell Laboratories como parte de Research Unix Versión 7. El nombre alude a Chronos, la personificación griega del tiempo. El formato era simple: cinco campos separados por espacios en blanco (minuto, hora, día-del-mes, mes, día-de-la-semana) en una línea en /usr/lib/crontab. La reescritura Vixie cron por Paul Vixie en 1987 se convirtió en la implementación moderna de facto; todas las distribuciones principales de Linux envían un cron derivado de Vixie, y Vixie añadió el crontab por usuario, el soporte de variables de entorno (MAILTO=, CRON_TZ=), y las macros de atajo @hourly / @daily / @reboot que todos usan hoy. La sintaxis de expresión cron luego se bifurcó en dos caminos. El Quartz Scheduler (Java, James House, 1998; donado a Apache y Terracotta) añadió un campo segundos al inicio, un campo año opcional al final, y los operadores L (último) / W (día laborable) / # (n-ésima ocurrencia), produciendo el cron de seis campos que AWS EventBridge (originalmente CloudWatch Events, 2014) y la anotación @Scheduled de Spring adoptaron más tarde. El formato NCronTab usado por Azure Functions (2016) puso los segundos primero pero mantuvo cinco campos de comportamiento. La era de la nube luego estandarizó el formato Vixie de cinco campos como lingua franca: los Kubernetes CronJobs (alpha 1.4 en 2016, GA en 1.21 en 2021) aceptan exactamente cinco campos, al igual que GitHub Actions (on.schedule.cron, 2019), GCP Cloud Scheduler (2018), y Vercel Cron Jobs (2022). Los constructores visuales de cron, la categoría a la que pertenece esta herramienta, emergieron alrededor de 2010-2015: crontab.guru (Christine Dodrill, 2014) se convirtió en la referencia más citada, y la biblioteca cron-descriptor (Brady Holt, originalmente .NET, portada a Java/Python/JS) impulsó la mayoría de las capas de traducción de «cron en inglés sencillo» en las que se basan decodificadores y generadores. Medio siglo después de Bell Labs, los mismos cinco campos siguen programando las copias de seguridad nocturnas del mundo.
La anatomía de una expresión cron
- Cinco campos, separados por espacios en blanco. En orden:
minuto (0-59) hora (0-23) día-del-mes (1-31) mes (1-12) día-de-la-semana (0-6). La expresión0 9 * * 1significa «minuto 0, hora 9, cualquier día-del-mes, cualquier mes, día de la semana 1 (lunes)», es decir, 9:00 AM todos los lunes. El mes está indexado a 1;0 0 1 0 *es inválido porque no hay mes 0. - Los cuatro operadores.
*coincide con todos los valores del rango del campo.,lista valores discretos:0,15,30,45en el campo minuto.-define un rango:9-17en el campo hora cubre las 9 AM hasta las 5 PM./establece un paso:*/15en minutos se dispara en 0, 15, 30, 45. Estos cuatro operadores se combinan libremente:*/15 8-18 * * 1-5significa «cada 15 minutos entre las 8 y las 18, solo días laborables». - Macros de atajo. Vixie cron y la mayoría de los parseadores modernos aceptan
@yearly(o@annually, equivalente a0 0 1 1 *),@monthly(0 0 1 * *),@weekly(0 0 * * 0),@daily(o@midnight,0 0 * * *),@hourly(0 * * * *), y el especial@reboot(se ejecuta una vez cuando arranca el demonio cron). Las plataformas en la nube varían: GitHub Actions y Vercel rechazan las macros. - El truco del paso.
*/Nen un campo con rango a-b se dispara en a, a+N, a+2N, ..., no necesariamente cada N unidades de tiempo de reloj de pared.*/7en el campo minuto se dispara en 0, 7, 14, 21, 28, 35, 42, 49, 56, luego salta de vuelta a 0 en la cima de la siguiente hora, produciendo una brecha de 4 minutos. La programación verdadera de cada 7 minutos es imposible en cron estándar sin un envoltorio. - La trampa OR (día-del-mes vs día-de-la-semana). Cuando ambos campos están restringidos, el cron estándar de Unix se dispara cuando cualquiera coincide, no ambos.
0 0 1 * 1no significa «lunes que caen en el 1»; significa «cada 1 del mes, más cada lunes». La página del manualcrontab(5)es explícita. Quartz, AWS EventBridge, y los timers de systemd expresan «primer lunes» limpiamente; Vixie cron necesita un envoltorio. - La numeración del día de la semana varía. Linux/Vixie, GitHub Actions, GCP Cloud Scheduler, Kubernetes, Azure NCronTab, y Spring 5.3+ usan todos Domingo = 0 (Vixie también acepta 7). Quartz y AWS EventBridge usan Domingo = 1.
0 0 * * 1por lo tanto significa «cada lunes» en Linux pero «cada domingo» bajo Quartz. Use nombres de tres letras (MON,TUE) cuando la portabilidad importe.
Dónde se usa la expresión
- cron de Linux / macOS. Pegue en
crontab -eseguido del comando. Se aceptan nombres (MON,JAN) y macros de atajo (@hourly,@daily,@reboot). EstablezcaCRON_TZ=America/New_Yorken la parte superior del crontab si el servidor está en UTC pero quiere programar en hora local. - Kubernetes CronJob. Establezca
spec.schedulecon su expresión de cinco campos.spec.timeZone(GA en 1.27, marzo de 2023) toma una zona IANA como «Europe/Paris». IncluirTZ=en la cadena de programación es rechazado desde 1.29 en adelante. Usespec.startingDeadlineSecondspara controlar el comportamiento de recuperación tras una caída. - GitHub Actions. Suelte en
on.schedule.cron. Las programaciones se ejecutan en UTC, la cadencia más corta es de 5 minutos (cualquier cosa más fina se redondea silenciosamente), y los workflows programados en repositorios públicos se desactivan automáticamente después de 60 días de inactividad del repositorio. Las cadenas cron dentro del YAML deben estar entre comillas para evitar la confusión del parseador con el*inicial. - AWS EventBridge / EventBridge Scheduler. Usa seis campos:
cron(min hr dom mon dow yr). Requiere?ya sea en día-del-mes o día-de-la-semana (no ambos literales). Los operadores de estilo QuartzL(último),W(día laborable), y#(n-ésima ocurrencia) funcionan todos aquí. El producto Scheduler (2022) añadió una expresiónat()separada para timers de un disparo. - GCP Cloud Scheduler. Sintaxis de cinco campos coincidiendo con Linux. La propiedad
timeZonetoma una zona IANA. Combine con Cloud Pub/Sub o destinos HTTP.retryConfigmaneja fallos transitorios; el predeterminado es ningún reintento, lo que sorprende a los ingenieros que esperan semántica al menos una vez. - Vercel Cron Jobs. Sintaxis de cinco campos en
vercel.json. Ambos campos día no se pueden establecer a la vez. Los planes Hobby limitan la cadencia a diaria; los planes Pro permiten horaria. Dispara un HTTP GET a la ruta de su función, lo que significa que la función debe ser idempotente si el disparador alguna vez reintenta.
Estándares, dialectos e hitos
- cron de AT&T Bell Labs (mayo de 1975). El original. Cinco campos, sin crontab por usuario, se ejecutaba desde
/usr/lib/crontab. Parte de Research Unix Versión 7. La gramática separada por espacios que todas las variantes modernas extienden. - Vixie cron (Paul Vixie, 1987). La reescritura que todos ejecutan. Añadió crontabs por usuario, las macros
@hourly/@daily/@reboot, alias de nombres (MON,JAN), y las variables de entornoMAILTO/CRON_TZ. La mayoría de las distribuciones de Linux envían Vixie cron, dcron, o cronie (un fork de Red Hat de Vixie). - Quartz Scheduler (James House, 1998). Biblioteca Java que introdujo el cron de seis campos (con segundos al inicio) y los operadores
L/W/#. Donada a Apache y luego Terracotta. La anotación@Scheduledde Spring incrusta la semántica de Quartz; Spring 5.3+ controvertidamente cambió el día de la semana del «Domingo=1» de Quartz al «Domingo=0» de Linux, así que la misma cadena ahora significa días diferentes bajo versiones diferentes. - timers de systemd (Lennart Poettering, 2010). Reemplaza cron en la mayoría de las distribuciones modernas de Linux. Usa una gramática diferente (
OnCalendar=Mon..Fri 09:00), admite tanto programaciones de calendario como monotónicas, registra enjournald, puede declarar dependencias de servicio, valida consystemd-analyze calendar, y combina precisión tipo cron con recuperación tipo anacron viaPersistent=true. - NCronTab (Azure Functions, 2016). Seis campos con segundos primero:
{second} {minute} {hour} {day} {month} {day-of-week}. Sin campo año. La zona horaria predeterminada es UTC; anule con el ajuste de aplicaciónWEBSITE_TIME_ZONEen los planes Linux App Service. - Sintaxis cron de AWS EventBridge. Seis campos con año al final:
cron(min hr dom mon dow yr). Requiere literalmente?como marcador de posición en el que de dom/dow no se use. Soporta QuartzL,W,#. Originalmente CloudWatch Events (2014), rebautizado EventBridge en 2019. - El problema de portabilidad de 5-vs-6 campos. Pegar una expresión de cinco campos Linux en Quartz o Spring produce errores «cron expression must consist of 6 fields»; pegar una expresión de seis campos en cron Linux produce «bad day-of-week» porque Linux lee la columna de segundos como el minuto. El error inverso es más peligroso porque puede silenciosamente analizar y ejecutarse en la programación equivocada.
- Extensión
H(hash) de Jenkins. Jenkins extiende el cron estándar conH, que elige un valor estable pero aleatorizado por tarea en lugar de ejecutar cada tarea en el mismo instante.H * * * *significa «cada hora, pero en un minuto diferente para cada tarea», previniendo el problema del «rebaño tronante» cuando muchas tareas se programan en el minuto 0.
Preguntas frecuentes adicionales
¿Son cinco campos lo mismo que seis o siete?
No. La forma POSIX clásica es de cinco campos (minuto, hora, día-del-mes, mes, día-de-la-semana). Quartz y Spring usan seis campos al añadir una columna de segundos al inicio, y Quartz acepta un séptimo campo año opcional. AWS EventBridge siempre usa seis campos terminando en año (cron(min hr dom mon dow yr)). Pegar una expresión de cinco campos en Quartz o Spring lanza un error de sintaxis; pegar una expresión de seis campos en Linux malinterpreta silenciosamente los campos.
¿Cuál es el intervalo más pequeño que cron puede expresar?
Cada minuto (* * * * *) en cron Unix estándar. No hay campo de segundos integrado. Los planificadores como Quartz o NCronTab añaden uno si necesita una cadencia inferior al minuto, y los timers de systemd pueden usar OnUnitActiveSec=30s. GitHub Actions limita la cadencia más corta a 5 minutos, y EventBridge se dispara dentro de una ventana de 60 segundos del tiempo programado, así que no dependa de cron para precisión de tiempo real estricta.
¿Cómo ejecuto una tarea el último día del mes?
El cron estándar de cinco campos no tiene un operador nativo «último día del mes». Quartz y AWS EventBridge admiten L en el campo día-del-mes: 0 0 L * ? se dispara a medianoche el último día. En cron Linux puro el atajo habitual es programar diariamente en días candidatos y filtrar el comando: 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script. Los timers de systemd lo expresan directamente con OnCalendar=*-*-* 00:00:00.
¿Por qué mi tarea cron no se ejecutó cuando esperaba?
Los sospechosos habituales, en orden: (1) el servidor está en una zona horaria diferente de la que asume (verifique con date); (2) PATH no es lo que su shell interactivo tiene, así que un comando funciona en el prompt pero falla bajo cron (use rutas absolutas); (3) la salida fue al correo electrónico y se la perdió (establezca MAILTO="" o redireccione a un archivo de registro); (4) el demonio cron no está ejecutándose (systemctl status cron); (5) la trampa OR (ver arriba) se está disparando en días extras que no pretendía.
¿Cuál es la diferencia entre cron, anacron, y los timers de systemd?
Cron espera que el sistema esté ejecutándose en el tiempo programado y silenciosamente salta tareas que caen durante el tiempo de inactividad: bien para servidores siempre encendidos, mal para portátiles. Anacron rastrea marcas de tiempo de última ejecución por tarea y recupera tareas perdidas tras un reinicio, al costo de precisión a nivel de día en lugar de minuto. Los timers de systemd reemplazan cron en la mayoría de las distribuciones modernas de Linux: admiten programaciones de calendario y monotónicas, registran en journald, pueden declarar dependencias de servicio, y usan Persistent=true para combinar precisión tipo cron con recuperación tipo anacron.
¿Cómo afectan las zonas horarias y el horario de verano a cron?
La mayoría de los demonios cron interpretan las programaciones en la zona horaria del sistema. En servidores en la nube eso generalmente significa UTC, así que 0 9 * * * se dispara a las 9 AM UTC, no las 9 AM locales. Establezca CRON_TZ=America/New_York en un crontab Linux; Kubernetes usa spec.timeZone; AWS, GCP, y Vercel cada uno toman una zona IANA explícita. Durante el cambio al horario de verano, las tareas programadas en la hora saltada se ejecutan inmediatamente después por Vixie cron pero se saltan enteramente por AWS EventBridge. El patrón más seguro es dejar cron en UTC y convertir dentro de la tarea.