stringtranslate.com

cron

La cronutilidad de línea de comandos es un programador de tareas en sistemas operativos tipo Unix . Los usuarios que configuran y mantienen entornos de software utilizan cron para programar tareas [1] (comandos o scripts de shell ), también conocidos como trabajos cron , [2] [3] para que se ejecuten periódicamente en horas, fechas o intervalos fijos. [4] Por lo general, automatiza el mantenimiento o la administración del sistema, aunque su naturaleza de propósito general lo hace útil para cosas como descargar archivos de Internet y descargar correo electrónico a intervalos regulares. [5]

Cron es más adecuado para programar tareas repetitivas. La programación de tareas únicas se puede realizar mediante la utilidad asociada at .

El nombre de Cron proviene de Chronos , la palabra griega para tiempo. [6] [ se necesita una mejor fuente ]

Descripción general

Las acciones de cron se controlan mediante un archivo crontab (tabla cron), un archivo de configuración que especifica los comandos de shell que se ejecutarán periódicamente según un cronograma determinado. Los archivos crontab se almacenan en el mismo lugar donde se guardan las listas de trabajos y otras instrucciones para el demonio cron . Los usuarios pueden tener sus propios archivos crontab individuales y, a menudo, hay un archivo crontab para todo el sistema (normalmente en /etco en un subdirectorio de, /etcpor ejemplo /etc/cron.d) que sólo los administradores del sistema pueden editar. [nota 1]

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

# * * * * * <comando a ejecutar> # | | | | | # | | | | día de la semana (0–6) (de 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 de cinco campos que representan el tiempo para ejecutar el comando, seguido de un comando de shell para ejecutar.

Aunque normalmente el trabajo se ejecuta cuando todos los campos de especificación de fecha y hora coinciden con la fecha y hora actuales, hay 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. [7]

Por ejemplo, lo siguiente borra el registro de errores de Apache un minuto después de la medianoche (00:01) todos los días, asumiendo que el shell predeterminado para el usuario cron es 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 p.m.) 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 -ésimo intervalo de tiempo. Además, se pueden especificar varios intervalos de tiempo específicos con comas (por ejemplo, 1,2,3). La línea siguiente generaría "hola mundo" en la línea de comandos cada 5 minutos de cada primera, segunda y tercera hora (es decir, 01:00, 01:05, 01:10, hasta 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 la implementación real almacene este archivo.

Algunas cronimplementaciones, como la popular cuarta edición de BSD escrita por Paul Vixie e incluida en muchas distribuciones de Linux, agregan un sexto campo: un nombre de usuario de cuenta que ejecuta el trabajo especificado (sujeto a la existencia y los permisos del usuario). Esto solo se permite en las crontabs del sistema, no en otras, que se asignan a un solo usuario para configurar. El sexto campo se usa a veces como alternativa para el año en lugar de un nombre de usuario de cuenta; el demonio nncron para Windows lo hace.

La implementación de cron de Amazon EventBridge no utiliza el día de la semana basado en 0, sino que es 1-7 de domingo a sábado (en lugar de 0-6), y también admite funciones de expresión adicionales como el primer día de la semana y el último día del mes. [8]

Definiciones de programación predefinidas no estándar

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

@rebootconfigura un trabajo para que se ejecute una vez cuando se inicia el demonio. Dado que cron normalmente no se reinicia nunca, esto generalmente corresponde al inicio de la máquina. Este comportamiento se aplica en algunas variantes de cron, como la que se proporciona en Debian , [10] de modo que simplemente reiniciar el demonio no vuelva a ejecutar @rebootlos trabajos.

@rebootPuede ser útil si es necesario iniciar un servidor o demonio bajo un usuario en particular y el usuario no tiene acceso para configurar init para iniciar el programa.

Permisos de cron

Estos dos archivos juegan un papel importante:

Tenga en cuenta que si ninguno de estos archivos existe, entonces, dependiendo de los parámetros de configuración dependientes del sitio, solo el superusuario puede usar trabajos cron o todos los usuarios pueden usar trabajos cron.

Manejo de zona horaria

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 que se ejecuta el demonio de cron. Esto puede ser una fuente de disputa si una gran máquina multiusuario tiene usuarios en varias zonas horarias, especialmente si la zona horaria predeterminada del sistema incluye el potencialmente confuso DST . Por lo tanto, una implementación de cron puede, como caso especial, reconocer líneas de la forma "CRON_TZ=<zona horaria>" en crontabs de usuario, interpretando las entradas de crontab posteriores en relación con esa zona horaria. [11]

Historia

Primeras versiones

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

  1. Leer /usr/lib/crontab[13]
  2. Determinar si algún comando debe ejecutarse en la fecha y hora actuales y, de ser así, ejecutarlo 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, ya sea que encontrara trabajo que hacer o no. En un experimento realizado en la Universidad de Purdue a fines de la década de 1970 para extender el servicio de cron a los 100 usuarios en un VAX de tiempo compartido , se descubrió que esto generaba demasiada carga en el sistema.

Capacidad multiusuario

La siguiente versión de cron, con el lanzamiento de Unix System V , se creó para extender las capacidades de cron a todos los usuarios de un sistema Unix, no solo al superusuario. Aunque esto puede parecer trivial hoy en día, ya que la mayoría de los sistemas Unix y similares tienen procesadores potentes y una pequeña cantidad de usuarios, en ese momento requería un nuevo enfoque en un sistema de un MIPS que tenía aproximadamente 100 cuentas de usuario.

En la edición 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 describe una estructura de datos de cola de eventos para sistemas de simulación discretos impulsados ​​por eventos que demostró "un rendimiento superior al de los algoritmos de lista enlazada simple comúnmente utilizados", buen comportamiento dadas distribuciones de tiempo no uniformes y complejidad en el peor de los casos , siendo "n" el número de eventos en la cola.

Un estudiante de posgrado de Purdue, Robert Brown, al revisar este artículo, reconoció el paralelismo entre cron y los simuladores de eventos discretos , y creó una implementación del administrador de listas de eventos (ELM) de Franta-Maly para experimentación. Los simuladores de eventos discretos se ejecutan en tiempo virtual , extrayendo eventos de la cola de eventos lo más rápido posible y avanzando su noción de "ahora" hasta el momento programado del próximo evento. La ejecución del simulador de eventos en "tiempo real" en lugar de tiempo virtual creó una versión de cron que pasaba la mayor parte del tiempo durmiendo, esperando el momento programado para ejecutar la tarea al principio de la lista de eventos.

El año escolar siguiente, nuevos estudiantes ingresaron al programa de posgrado de Purdue, 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 para convertirlo en un servicio de producción, y este cron multiusuario comenzó a usarse en Purdue a fines de 1979. Esta versión de cron reemplazó por completo al /etc/cronque se usaba en el VAX 11/780 del departamento de Ciencias de la Computación que funcionaba con 32/V.

El algoritmo utilizado por este cron es el siguiente:

  1. Al iniciar, busque un archivo con el nombre .crontaben los directorios de inicio de todos los titulares de cuentas.
  2. Para cada archivo crontab encontrado, determine la próxima vez en el futuro en que debe ejecutarse cada comando.
  3. Coloque esos comandos en la lista de eventos de Franta–Maly con su tiempo correspondiente y su especificador de tiempo de "cinco campos".
  4. Entrar al bucle principal:
    1. Examine la entrada de la tarea al principio de la cola y calcule qué tan lejos en el futuro debe ejecutarse.
    2. Duerme durante ese período de tiempo.
    3. Al despertar y luego de verificar la hora correcta, ejecuta la tarea al principio de la cola (en segundo plano) con los privilegios del usuario que la creó.
    4. Determinar la próxima vez en el futuro para ejecutar este comando y volver a colocarlo en la lista de eventos en ese valor de tiempo.

Además, el demonio responde a las señales SIGHUP para volver a escanear los archivos crontab modificados y programa "eventos de activación" especiales a la hora y a la media hora para buscar archivos crontab modificados. Se omiten muchos detalles aquí sobre las imprecisiones del seguimiento de la hora del día de la computadora, la programación de alarmas de Unix, los cambios explícitos de la hora del día y la gestión de procesos, todos los cuales representan la mayoría de las líneas de código en este cron. Este cron también capturó la salida de stdout y stderr y envió por correo electrónico cualquier salida al propietario del crontab.

Los recursos consumidos por este cron escalan solo con la cantidad de trabajo que se le asigna y no aumentan inherentemente con el tiempo, con la excepción de la verificación periódica de cambios.

Williamson completó sus estudios y dejó la Universidad con una Maestría en Ciencias de la Computación y se unió a AT&T Bell Labs en Murray Hill, Nueva Jersey, y se llevó este cron con él. En Bell Labs, él y otros incorporaron el comando Unixat a cron, movieron los archivos crontab fuera de los directorios personales de los usuarios (que no eran específicos del host) y a un directorio de spool específico del host común, y por necesidad agregaron el crontabcomando para permitir a los usuarios copiar sus crontabs a ese directorio de spool.

Esta versión de cron apareció más tarde, sin apenas modificaciones, 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 Purdue Research Foundation, 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 , aparecieron nuevos crons. El más común de ellos es el cron Vixie, codificado originalmente por Paul Vixie en 1987. La versión 3 de Vixie cron se lanzó a fines de 1993. La versión 4.1 se renombró como ISC Cron y se lanzó en enero de 2004. La versión 3, con algunas correcciones de errores menores, se usa en la mayoría de las distribuciones de Linux y BSD.

En 2007, Red Hat bifurcó vixie-cron 4.1 en el proyecto cronie , agregando características como soporte para PAM y SELinux. [14] En 2009, anacron 2.3 se fusionó con cronie. [15] 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. [16]

En 2003, Dale Mellor introdujo mcron, [17] una variante de cron escrita en Guile que proporciona compatibilidad cruzada con Vixie cron y al mismo tiempo proporciona mayor flexibilidad ya que permite utilizar código de esquema arbitrario en los 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 tradicionales de Vixie), 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 y solo si los resultados de otros trabajos cumplen ciertos criterios. Mcron se implementa de forma predeterminada en el administrador de paquetes Guix , que incluye disposiciones ( servicios ) para que el administrador de paquetes emita crontabs mcron de forma monádica mientras garantiza que los paquetes necesarios para la ejecución del trabajo estén instalados y que los crontabs correspondientes se refieran a ellos correctamente. [18]

Una solución webcron programa tareas de anillo para que se ejecuten periódicamente dondequiera que las implementaciones de cron no estén disponibles en un entorno de alojamiento web .

Expresión cron

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

Los comentarios comienzan con un símbolo de comentario # y deben estar 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 configura como 'root'.

En algunos usos del formato cron también hay un campo de segundos al comienzo del patrón. En ese caso, la expresión cron es una cadena que comprende 6 o 7 campos. [20]

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


Personajes no estándar

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

L
"L" significa "último". Cuando se utiliza en el campo de día de la semana, permite especificar construcciones como "el último viernes" (" 5L ") de un mes determinado. En el campo de día del mes, especifica el último día del mes.
W
El carácter 'W' está permitido para el campo de 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 el valor para el campo de día del mes, el significado es: "el día de la semana más cercano al 15 del mes". Por lo tanto, si el 15 es sábado, el disparador se activa el viernes 14. Si el 15 es domingo, el disparador se activa el lunes 16. Si el 15 es martes, se activa el martes 15. Sin embargo, si se especifica "1W" como el valor para el día del mes y el 1 es sábado, el disparador se activa el lunes 3, ya que no "salta" el límite de los días de un 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 uso de '#' en el campo de día de la semana, y debe ir seguido de un número entre uno y cinco. Permite especificar construcciones como "el segundo viernes" de un mes determinado. [22] Por ejemplo, introducir "5#3" en el campo de día de la semana corresponde al tercer viernes de cada mes.
Signo de interrogación ( ?)
En algunas implementaciones, se utiliza en lugar de ' * ' para dejar en blanco el día del mes o el día de la semana. Otras implementaciones de cron sustituyen "?" por la hora de inicio del demonio de cron, de modo que se actualizaría si cron se inició a las 8:25 a. m. y se ejecutaría a esta hora todos los días hasta que se reiniciara nuevamente. [23]? ? * * * *25 8 * * * *
Barra oblicua ( /)
En vixie-cron, las barras se pueden combinar con rangos para especificar valores de paso. [9] 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 verbosa 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX no define un uso para las barras; su fundamento (comentarios sobre una extensión BSD) señala que la definición se basa en el formato System V pero no excluye la posibilidad de extensiones. [7]

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, es /2, /3, /4, /5, /6, /10, /12, /15, /20 y /30 porque 60 es divisible uniformemente por esos números; para horas, es /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 de día a veces se ejecuta después de 1, 2 o 3 días, dependiendo del mes y el 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 esta y ahora, requerida para un conteo de frecuencia preciso; en cambio, cron es un mero comparador de patrones).

Algunas bibliotecas específicas de lenguaje que ofrecen la capacidad de programación crontab no requieren rangos "estrictos" 15-59/XX a la izquierda de la barra cuando se utilizan rangos. [24] En estos casos, 15/XX es lo mismo que una programación vixie-cron de 15-59/10 en la sección de minutos. De manera similar, 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
En el sistema de integración continua de Jenkins se utiliza la palabra "H" para indicar que se sustituye un valor "hash". Por lo tanto, en lugar de un número fijo como " 20 * * * *", que significa 20 minutos después de la hora cada hora, " H * * * *" indica que la tarea se realiza cada hora a una hora no especificada 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

  1. ^ Esto depende del tipo de distribución.

Referencias

  1. ^ "Automatización con tareas Cron en Centos 8". 6 de abril de 2020.
  2. ^ "¿Diferencia entre cron, crontab y cronjob?". Desbordamiento de pila .
  3. ^ "Cron Job: una guía completa para principiantes 2020". 24 de mayo de 2019.
  4. ^ "Crontab – Referencia rápida". Elección del administrador . 21 de diciembre de 2009.
  5. ^ "Introducción a cron para principiantes". Unixgeeks.org . Consultado el 6 de noviembre de 2013 .
  6. ^ "Linux - cron y crontab".
  7. ^ ab "crontab", The Open Group Base Specification Issue 7 — IEEE Std 1003.1, 2013 Edition , The Open Group, 2013 , consultado el 18 de mayo de 2015
  8. ^ "Expresiones de programación para reglas". Amazon.
  9. ^ ab "Manual de formatos de archivos de FreeBSD para CRONTAB(5)". El Proyecto FreeBSD.
  10. ^ "#77563 - cron: crontab(5) miente, '@reboot' aparece siempre que se reinicia cron, no el sistema". Sistema de seguimiento de errores de Debian . Consultado el 6 de noviembre de 2013 .
  11. ^ "crontab(5): tablas para manejar cron - Página del manual de Linux". Linux.die.net . Consultado el 6 de noviembre de 2013 .
  12. ^ "V7/etc/rc". Página de inicio de Minnie . Consultado el 12 de septiembre de 2020 .
  13. ^ "V7/usr/src/cmd/cron.c". Página de inicio de Minnie . Consultado el 12 de septiembre de 2020 .
  14. ^ "cronie-crond/cronie". cronie-crond. 20 de septiembre de 2024.
  15. ^ "Carga inicial de anacron-2.3 que debería optimizarse para un mejor rendimiento · cronie-crond/cronie@55f4057". GitHub .
  16. ^ Pryor, Jim (5 de enero de 2010). "Cron". [email protected] (Lista de correo) . Consultado el 6 de noviembre de 2013 .
  17. ^ Mellor, Dale (1 de junio de 2003). «Mcron: requisitos y análisis de los usuarios» . Consultado el 11 de junio de 2019 .
  18. ^ "Manual de referencia de GNU Guix: 8.8.2 Ejecución de tareas programadas". GNU Guix. 19 de mayo de 2019. Consultado el 11 de junio de 2019 .
  19. ^ "Cómo usar el cron de Ubuntu". 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 desde el original el 25 de octubre de 2011. Consultado el 24 de octubre de 2011 .
  21. ^ "referencia de crontab de mcron". Gnu.org . Consultado el 6 de noviembre de 2013 .
  22. ^ "Guía de integración de Oracle® Role Manager". Docs.oracle.com . Consultado el 6 de noviembre de 2013 .
  23. ^ "Formato Cron". nnBackup . Consultado el 27 de mayo de 2014 .
  24. ^ "Crontab de Python". GitHub . Consultado el 5 de abril de 2023 .
  25. ^ "Sintaxis de activación del temporizador". jenkins.com . Consultado el 16 de febrero de 2018 .

Enlaces externos