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

Dónde se usa la expresión

Estándares, dialectos e hitos

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.

Herramientas relacionadas