Articulo de referencia

cron

cron es un programador de tareas basado en el tiempo . Una tarea programada se conoce como tarea cron . [ 1 ] [ 2 ] [ 3 ] [ 4 ] Aunque normalmente se utiliza para automatizar el...

crones un programador de tareas basado en el tiempo . Una tarea programada se conoce como tarea cron . [ 1 ] [ 2 ] [ 3 ] [ 4 ] Aunque normalmente se utiliza para automatizar el mantenimiento y la administración del sistema, puede utilizarse para automatizar cualquier tarea. crones más adecuado para programar tareas repetitivas, ya que la programación de una tarea única puede realizarse a través de at.

El nombre del daimonion tiene su origen en Chronos , la palabra griega para tiempo. [ 5 ]

cronGeneralmente está disponible en sistemas operativos tipo Unix .

Descripción general

Las acciones de cron se rigen por un archivo crontab (tabla cron). Los archivos crontab se almacenan donde se guardan las listas de tareas y otras instrucciones para el demonio cron . Los usuarios pueden tener sus propios archivos crontab individuales y, a menudo, existe un archivo crontab para todo el sistema (normalmente en /etco un subdirectorio de, /etcpor ejemplo /etc/cron.d, ) que solo los administradores del sistema pueden editar.

Cada línea de un archivo crontab representa una tarea y tiene este aspecto:

 * * * * * <comando a ejecutar> # | | | | | # | | | | día de la semana (0–6) (domingo a sábado; # | | | mes (1–12) 7 también es domingo en algunos sistemas) # | | día del mes (1–31) # | hora (0–23) # minuto (0–59) 

La sintaxis de cada línea espera una expresión cron compuesta por cinco campos que representan la hora de ejecución del comando, seguida de un comando de shell para ejecutar.

Si bien normalmente el trabajo se ejecuta cuando todos los campos de especificación de fecha y hora coinciden con la fecha y hora actuales, existe una excepción: si tanto el "día del mes" (campo 3) como el "día de la semana" (campo 5) están restringidos (no contienen "*"), entonces uno o ambos deben coincidir con el día actual. [ 6 ]

Por ejemplo, lo siguiente borra el registro de errores de Apache un minuto después de la medianoche (00:01) todos los días, suponiendo que el intérprete de comandos predeterminado para el usuario cron sea compatible con Bourne shell :

1 0 * * * printf "" > /var/log/apache/error_log 

Este ejemplo ejecuta un programa de shell llamado export_dump.sh a las 23:45 (11:45 PM) todos los sábados.

45 23 * * 6 /home/oracle/scripts/export_dump.sh 

Nota: En algunos sistemas también es posible especificar */nque se ejecute cada n intervalo de tiempo. Además, se pueden especificar varios intervalos de tiempo específicos con comas (por ejemplo, 1,2,3). La siguiente línea mostraría "hola mundo" en la línea de comandos cada 5 minutos de la primera, segunda y tercera hora (es decir, 01:00, 01:05, 01:10, hasta las 03:55).

*/5 1 ,2,3 * * * echo hola mundo 

El archivo de configuración de un usuario se puede editar mediante una llamada, crontab -eindependientemente de dónde almacene la implementación real este archivo.

Algunas cronimplementaciones, como la popular cuarta edición de BSD escrita por Paul Vixie e incluida en muchas distribuciones de Linux, añaden un sexto campo: un nombre de usuario que ejecuta la tarea especificada (sujeto a la existencia del usuario y sus permisos). Esto solo está permitido en los crontabs del sistema; no en otros, que se asignan a un único usuario para su configuración. En ocasiones, el sexto campo se utiliza para el año en lugar del nombre de usuario; el demonio nncron de Windows hace esto.

La implementación de cron de Amazon EventBridge no utiliza el día de la semana basado en 0, sino que es del 1 al 7 (DOM-SAT) (en lugar del 0 al 6), además de admitir características de expresiones adicionales como el primer día de la semana y el último día del mes. [ 7 ]

Definiciones de programación predefinidas no estándar

Algunas implementaciones de cron [ 8 ] admiten las siguientes macros no estándar:

@rebootConfigura una tarea para que se ejecute una sola vez al iniciar el demonio. Dado que cron normalmente nunca se reinicia, esto suele coincidir con el arranque de la máquina. Este comportamiento se aplica en algunas variantes de cron, como la que se incluye en Debian [ 9 ], de modo que reiniciar el demonio no vuelva a ejecutar @rebootlas tareas.

@rebootPuede resultar útil si es necesario iniciar un servidor o demonio bajo un usuario específico, y dicho usuario no tiene acceso para configurar init e iniciar el programa.

Permisos de Cron

Estos dos archivos desempeñan un papel importante:

  • /etc/cron.allow – Si este archivo existe, debe contener el nombre del usuario para que este pueda usar las tareas programadas (cron jobs).
  • /etc/cron.deny – Si el archivo cron.allow no existe pero el archivo /etc/cron.deny sí existe, entonces, para usar trabajos cron, los usuarios no deben estar listados en el archivo /etc/cron.deny.

Tenga en cuenta que si ninguno de estos archivos existe, dependiendo de los parámetros de configuración específicos del sitio, solo el superusuario podrá usar las tareas programadas (cron jobs) o todos los usuarios podrán usarlas.

Gestión de zonas horarias

La mayoría de las implementaciones de cron simplemente interpretan las entradas de crontab en la configuración de zona horaria del sistema bajo la cual se ejecuta el demonio cron. Esto puede ser motivo de controversia si una máquina multiusuario grande tiene usuarios en varias zonas horarias, especialmente si la zona horaria predeterminada del sistema incluye el horario de verano, que puede resultar confuso . Por lo tanto, una implementación de cron puede, como caso especial, reconocer líneas del tipo "CRON_TZ= < zona horaria > " en los crontabs de los usuarios, interpretando las entradas de crontab subsiguientes en relación con esa zona horaria. [ 10 ]

Historia

Versiones tempranas

En la versión 7 de Unix, el cron era un servicio del sistema (más tarde llamado demonio ) que se invocaba /etc/rccuando el sistema operativo entraba en modo multiusuario. [ 11 ] Su algoritmo era sencillo:

  1. Leer /usr/lib/crontab[ 12 ]
  2. Determina si algún comando debe ejecutarse en la fecha y hora actuales y, de ser así, ejecútalo como superusuario , root.
  3. Duerme un minuto
  4. Repita desde el paso 1.

Esta versión de cron era básica y robusta, pero también consumía recursos, independientemente de si encontraba trabajo que hacer o no. En un experimento realizado en la Universidad de Purdue a finales de la década de 1970 para extender el servicio de cron a los 100 usuarios de un sistema VAX de tiempo compartido , se descubrió que sobrecargaba el sistema.

Capacidad multiusuario

La siguiente versión de cron, con el lanzamiento de Unix System V , se creó para extender sus capacidades a todos los usuarios de un sistema Unix, no solo al superusuario. Si bien esto puede parecer trivial hoy en día, dado que la mayoría de los sistemas Unix y similares cuentan con procesadores potentes y un número reducido de usuarios, en aquel entonces requería un nuevo enfoque en un sistema MIPS con aproximadamente 100 cuentas de usuario.

En el número de agosto de 1977 de Communications of the ACM , WR Franta y Kurt Maly publicaron un artículo titulado "Una estructura de datos eficiente para el conjunto de eventos de simulación", que describía una estructura de datos de cola de eventos para sistemas de simulación discretos basados ​​en eventos que demostraba "un rendimiento superior al de los algoritmos de lista enlazada simple de uso común", un buen comportamiento ante distribuciones de tiempo no uniformes y una complejidad en el peor de los casos baja.θ(norte){\displaystyle \theta \left({\sqrt {n}}\right)}, donde "n" es el número de eventos en la cola.

Robert Brown, estudiante de posgrado de Purdue, al revisar este artículo, reconoció el paralelismo entre cron y los simuladores de eventos discretos , y creó una implementación del gestor de listas de eventos Franta-Maly (ELM) para experimentar. Los simuladores de eventos discretos se ejecutan en tiempo virtual , extrayendo eventos de la cola lo más rápido posible y adelantando su noción de "ahora" a la hora programada del siguiente evento. Al ejecutar el simulador de eventos en "tiempo real" en lugar de tiempo virtual, se creó una versión de cron que pasaba la mayor parte del tiempo inactiva, esperando la hora programada para ejecutar la tarea que encabezaba la lista de eventos.

El siguiente año académico, el programa de posgrado de Purdue recibió a nuevos estudiantes, entre ellos Keith Williamson, quien se unió al personal de sistemas del departamento de Ciencias de la Computación. Como "tarea de calentamiento", Brown le pidió que desarrollara el prototipo de cron hasta convertirlo en un servicio de producción, y este cron multiusuario se implementó en Purdue a finales de 1979. Esta versión de cron reemplazó por completo la /etc/cronque se utilizaba en el VAX 11/780 del departamento de ciencias de la computación, que funcionaba a 32 V.

El algoritmo utilizado por este cron es el siguiente:

  1. Al iniciar el sistema, busque un archivo con ese nombre .crontaben los directorios personales de todos los titulares de la cuenta.
  2. Para cada archivo crontab encontrado, determine la próxima vez en el futuro en que se debe ejecutar cada comando.
  3. Coloque esos comandos en la lista de eventos de Franta-Maly con su hora correspondiente y su especificador de hora de "cinco campos".
  4. Entrar en el bucle principal:
    1. Examine la entrada de la tarea que se encuentra al principio de la cola y calcule cuánto tiempo después debe ejecutarse.
    2. Duerme durante ese período de tiempo.
    3. Al despertar y tras verificar la hora correcta, ejecute la tarea que se encuentra al principio de la cola (en segundo plano) con los privilegios del usuario que la creó.
    4. Determina el próximo momento en el futuro en el que se ejecutará este comando y vuelve a incluirlo en la lista de eventos en ese momento.

Además, el demonio responde a las señales SIGHUP para volver a escanear los archivos crontab modificados y programa eventos especiales de activación a la hora en punto y a la media hora para buscar archivos crontab modificados. Aquí se omiten muchos detalles sobre las imprecisiones del seguimiento de la hora del ordenador, la programación de alarmas de Unix, los cambios explícitos de hora y la gestión de procesos, que constituyen la mayor parte del código de este cron. Este cron también capturaba la salida de stdout y stderr y enviaba por correo electrónico cualquier resultado al propietario del crontab.

Los recursos consumidos por esta tarea programada (cron) solo aumentan en función de la cantidad de trabajo que se le asigna y no se incrementan inherentemente con el tiempo, con la excepción de la comprobación periódica de cambios.

Williamson completó sus estudios y se graduó de la universidad con una maestría en informática. Se unió a AT&T Bell Labs en Murray Hill, Nueva Jersey, y se llevó consigo este cron. En Bell Labs, él y otros incorporaron el comando Unixat a cron, movieron los archivos crontab de los directorios personales de los usuarios (que no eran específicos del host) a un directorio de cola común específico del host y, por necesidad, agregaron el crontabcomando para permitir que los usuarios copiaran sus crontabs a ese directorio de cola.

Esta versión de cron apareció posteriormente prácticamente sin cambios en Unix System V y en BSD y sus derivados, Solaris de Sun Microsystems , IRIX de Silicon Graphics , HP-UX de Hewlett-Packard y AIX de IBM . Técnicamente, la licencia original de estas implementaciones debería pertenecer a la Fundación de Investigación de Purdue, que financió el trabajo, pero esto ocurrió en una época en la que se prestaba poca atención a estos asuntos.

Versiones modernas

Con la llegada del Proyecto GNU y Linux , surgieron nuevos cron. El más extendido es Vixie cron, originalmente programado por Paul Vixie en 1987. La versión 3 de Vixie cron se lanzó a finales de 1993. La versión 4.1 pasó a llamarse ISC Cron y se lanzó en enero de 2004. La versión 3, con algunas correcciones de errores menores, se utiliza en la mayoría de las distribuciones de Linux y BSD.

En 2007, Red Hat bifurcó vixie-cron 4.1 al proyecto cronie , agregando características como soporte para PAM y SELinux. [ 13 ] En 2009, anacron 2.3 se fusionó con cronie. [ 14 ] Sin embargo, Anacron no es un programa cron independiente; otro trabajo cron debe llamarlo.

El dcron de DragonFly fue creado por su fundador Matt Dillon , y su mantenimiento fue asumido por Jim Pryor en 2010. [ 15 ]

En 2003, Dale Mellor presentó mcron, [ 16 ] una variante de cron escrita en Guile que proporciona compatibilidad cruzada con Vixie cron, además de ofrecer mayor flexibilidad, ya que permite el uso de código Scheme arbitrario en cálculos de programación y definiciones de trabajos. Dado que tanto el demonio mcron como los archivos crontab suelen estar escritos en Scheme (aunque mcron también acepta crontabs Vixie tradicionales), el estado acumulativo de la cola de trabajos de un usuario está disponible para su código de trabajo, que puede programarse para ejecutarse si los resultados de otros trabajos cumplen ciertos criterios. Mcron se implementa por defecto bajo el gestor de paquetes Guix , que incluye provisiones ( servicios ) para que el gestor de paquetes emita crontabs mcron de forma monádica, asegurando al mismo tiempo que los paquetes necesarios para la ejecución de trabajos estén instalados y que los crontabs correspondientes hagan referencia a ellos correctamente. [ 17 ]

Una solución webcron programa tareas de anillo para que se ejecuten periódicamente allí donde no haya implementaciones de cron disponibles en un entorno de alojamiento web .

Esfuerzos de estandarización

En 2025, se publicó la Especificación de Patrón Cron Abierta (OCPS) para abordar la fragmentación en la sintaxis de cron en diferentes implementaciones. OCPS 1.0 proporciona una especificación formal del dialecto cron de Vixie, codificando el formato de patrón de cinco campos con reglas explícitas para casos límite previamente ambiguos. [ 18 ]

La especificación está diseñada como un superconjunto retrocompatible, y se prevé que las futuras versiones añadan gradualmente características como programaciones predefinidas, precisión de segundo nivel y modificadores de calendario avanzados, manteniendo la compatibilidad con versiones anteriores.

Expresión cron

Una expresión cron es una cadena que comprende cinco, seis o siete campos separados por espacios en blanco [ 19 ] que representa un conjunto de horas, normalmente como una programación para ejecutar alguna rutina.

Los comentarios comienzan con el símbolo # y deben ir en una línea aparte.

Las abreviaturas de mes y día de la semana no distinguen entre mayúsculas y minúsculas.

En el caso particular del archivo crontab del sistema (/etc/crontab), se inserta un campo de usuario antes del comando . Generalmente se establece en 'root'.

Asterisco ( *)
Los asteriscos (también conocidos como comodines) representan "todo". Por ejemplo, usar "* * * * *" hará que se ejecute cada minuto. Usar "* * * * 1" hará que se ejecute cada minuto solo los lunes. Usar seis asteriscos significa que se ejecutará cada segundo cuando se admitan segundos.
Coma ( ,)
Las comas se utilizan para separar los elementos de una lista. Por ejemplo, usar "LUN,MIÉ,VIE" en el quinto campo (día de la semana) significa lunes, miércoles y viernes.
Guion ( -)
El guion define rangos. Por ejemplo, "2000-2010" indica todos los años comprendidos entre 2000 y 2010, ambos inclusive.
Porcentaje ( %)
Los signos de porcentaje (%) en el comando, a menos que se escapen con una barra invertida (\), se convierten en caracteres de nueva línea, y todos los datos después del primer  % se envían al comando como entrada estándar. [ 21 ]

Caracteres no estándar

Los siguientes son caracteres no estándar y existen solo en algunas implementaciones de cron, como el planificador de tareas Quartz para Java .

L
La letra 'L' significa "último". Cuando se usa en el campo del día de la semana, permite especificar construcciones como "el último viernes" (" 5L ") de un mes determinado. En el campo del día del mes, especifica el último día del mes.
W
El carácter 'W' está permitido para el campo del día del mes. Este carácter se utiliza para especificar el día de la semana (de lunes a viernes) más cercano al día dado. Por ejemplo, si se especifica " 15W " como valor para el campo del día del mes, significa: "el día de la semana más cercano al día 15 del mes". Así, si el día 15 es sábado, el disparador se activa el viernes 14. Si el día 15 es domingo, el disparador se activa el lunes 16. Si el día 15 es martes, entonces se activa el martes 15. Sin embargo, si se especifica "1W" como valor para el día del mes, y el día 1 es sábado, el disparador se activa el lunes 3, ya que no "salta" el límite de los días del mes. El carácter 'W' solo se puede especificar cuando el día del mes es un solo día, no un rango o una lista de días.
Hash ( #)
Se permite el símbolo '#' para el campo del día de la semana, seguido de un número entre uno y cinco. Permite especificar construcciones como "el segundo viernes" de un mes determinado. [ 22 ] Por ejemplo, al introducir "5#3" en el campo del día de la semana, corresponde al tercer viernes de cada mes.
Signo de interrogación ( ?)
En algunas implementaciones, se usa en lugar de ' * ' para dejar en blanco el día del mes o el día de la semana. Otras implementaciones de cron sustituyen "?" con la hora de inicio del demonio cron, de modo que se actualizaría si cron se iniciara a las 8:25 a. m. y se ejecutaría a esa hora todos los días hasta que se reiniciara de nuevo. [ 23 ]? ? * * * *25 8 * * * *
Barra inclinada ( /)
En vixie-cron, las barras diagonales se pueden combinar con rangos para especificar valores de paso. [ 8 ] Por ejemplo, */5 en el campo de minutos indica cada 5 minutos (ver nota a continuación sobre frecuencias). Es una abreviatura de la forma POSIX más detallada 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX no define un uso para las barras diagonales; su justificación (que comenta una extensión de BSD) señala que la definición se basa en el formato System V, pero no excluye la posibilidad de extensiones. [ 6 ]

Tenga en cuenta que las frecuencias en general no se pueden expresar; solo los valores de paso que dividen uniformemente su rango expresan frecuencias precisas (para minutos y segundos, son /2, /3, /4, /5, /6, /10, /12, /15, /20 y /30 porque 60 es divisible uniformemente por esos números; para horas, son /2, /3, /4, /6, /8 y /12 ); todos los demás "pasos" posibles y todos los demás campos producen períodos "cortos" inconsistentes al final de la unidad de tiempo antes de que se "reinicie" al siguiente minuto, segundo o día; por ejemplo, ingresar */5 para el campo del día a veces se ejecuta después de 1, 2 o 3 días, dependiendo del mes y del año bisiesto; esto se debe a que cron no tiene estado (no recuerda la hora de la última ejecución ni cuenta la diferencia entre ella y ahora, necesaria para un conteo de frecuencia preciso; en cambio, cron es un simple comparador de patrones).

Algunas bibliotecas específicas de lenguaje que ofrecen la capacidad de programación de crontab no requieren rangos "estrictos" 15-59/XX a la izquierda de la barra cuando se usan rangos. [ 24 ] En estos casos, 15/XX es lo mismo que una programación de vixie-cron de 15-59/10 en la sección de minutos. De manera similar, se puede eliminar el -23 adicional de 0-23/XX , -31 de 1-31/XX y -12 de 1-12/XX para horas, días y meses; respectivamente.

H
La letra 'H' se utiliza en el sistema de integración continua Jenkins para indicar que se sustituye un valor "hash". Así, en lugar de un número fijo como ' 20 * * * *', que significa que la tarea se realiza a los 20 minutos de cada hora, ' H * * * *' indica que la tarea se ejecuta cada hora en un momento indeterminado pero invariable para cada tarea. Esto permite distribuir las tareas a lo largo del tiempo, en lugar de que todas comiencen al mismo tiempo y compitan por los recursos. [ 25 ]

Véase también

Nota

Referencias

  1. "Automatización con tareas programadas (Cron job) en CentOS 8" . 6 de abril de 2020. Archivado del original el 5 de agosto de 2020. Consultado el 19 de agosto de 2020 .
  2. "¿Diferencia entre cron, crontab y cronjob?" . Stack Overflow . Archivado del original el 1 de abril de 2021 . Consultado el 19 de agosto de 2020 .
  3. "Cron Job: una guía completa para principiantes 2020" . 24 de mayo de 2019. Archivado del original el 24 de junio de 2019. Consultado el 19 de agosto de 2020 .
  4. "Crontab – Referencia rápida" . Admin's Choice . 21 de diciembre de 2009. Archivado del original el 2 de septiembre de 2020. Consultado el 19 de agosto de 2020 .
  5. "Linux - cron y crontab" . CornellCALS . Facultad de Agricultura y Ciencias de la Vida. Archivado del original el 4 de junio de 2019. Consultado el 12 de julio de 2025 .
  6. 1 2 "crontab" , The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition , The Open Group, 2013, archivado del original el 16 de mayo de 2015 , recuperado el 18 de mayo de 2015
  7. "Expresiones de programación para reglas" . Amazon. Archivado del original el 2 de diciembre de 2020. Consultado el 19 de enero de 2021 .
  8. 1 2 "Manual de formatos de archivo de FreeBSD para CRONTAB(5)" . El proyecto FreeBSD. Archivado del original el 1 de febrero de 2017. Recuperado el 30 de abril de 2015 .
  9. "#77563 - cron: crontab(5) miente, '@reboot' es cuando cron se reinicia, no el sistema" . Sistema de seguimiento de errores de Debian . Archivado del original el 2 de julio de 2019. Recuperado el 6 de noviembre de 2013 .
  10. "crontab(5): tablas para controlar cron - página man de Linux" . Linux.die.net. Archivado del original el 8 de noviembre de 2013. Consultado el 6 de noviembre de 2013 .
  11. "V7/etc/rc" . Página principal de Minnie . Archivado del original el 24 de febrero de 2021. Consultado el 12 de septiembre de 2020 .
  12. "V7/usr/src/cmd/cron.c" . Página principal de Minnie . Archivado del original el 28 de mayo de 2020. Consultado el 12 de septiembre de 2020 .
  13. "cronie-crond/cronie" . cronie-crond. 20 de septiembre de 2024. Archivado del original el 11 de diciembre de 2024. Recuperado el 27 de septiembre de 2024 .
  14. "Carga inicial de anacron-2.3 que debería optimizarse para un mejor · cronie-crond/cronie@55f4057" . GitHub . Archivado del original el 11-12-2024 . Recuperado el 27-09-2024 .
  15. Pryor, Jim (2010-01-05). "Cron" . arch-general@archlinux.org (Lista de correo) . Recuperado el 2013-11-06 .
  16. Mellor, Dale (1 de junio de 2003). "Mcron: Requisitos del usuario y análisis" . Archivado del original el 23 de agosto de 2019. Consultado el 11 de junio de 2019 .
  17. "Manual de referencia de GNU Guix: 8.8.2 Ejecución de trabajos programados" . GNU Guix. 19 de mayo de 2019. Archivado del original el 8 de mayo de 2019. Consultado el 11 de junio de 2019 .
  18. "OCPS 1.0: La línea base" . open-source-cron. 28 de octubre de 2025. Consultado el 28 de octubre de 2025 .
  19. "Ubuntu Cron Howto" . Help.ubuntu.com. 4 de mayo de 2013. Consultado el 6 de noviembre de 2013 .
  20. "Tutorial de CronTrigger" . Sitio web de Quartz Scheduler . Archivado del original el 25 de octubre de 2011. Consultado el 24 de octubre de 2011 .
  21. "Referencia de crontab de mcron" . Gnu.org. Archivado del original el 27 de marzo de 2017. Consultado el 6 de noviembre de 2013 .
  22. "Guía de integración de Oracle® Role Manager" . Docs.oracle.com. Archivado del original el 25/06/2013 . Consultado el 06/11/2013 .
  23. "Formato Cron" . nnBackup. Archivado del original el 19/06/2014 . Recuperado el 27/05/2014 .
  24. "Python Crontab" . GitHub . Archivado del original el 6 de abril de 2023. Consultado el 5 de abril de 2023 .
  25. "Sintaxis del activador del temporizador" . jenkins.com. Archivado del original el 12 de junio de 2020. Consultado el 16 de febrero de 2018 .