La utilidad de software cron, también conocida como cron job [1] [2], es un programador de tareas basado en el tiempo en sistemas operativos de computadoras similares a Unix . Los usuarios que configuran y mantienen entornos de software utilizan cron para programar trabajos [3] (comandos o scripts de shell ) 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] El origen del nombrecron es de la palabra griega para tiempo, χρόνος ( chronos ). [6] [ fuente no confiable ]
Desarrollador (es) | Laboratorios AT&T Bell |
---|---|
Versión inicial | Mayo de 1975 |
Escrito en | C |
Sistema operativo | Linux , macOS , FreeBSD |
Plataforma | Multiplataforma |
Tipo | Mando |
Cron es más adecuado para programar tareas repetitivas. La programación de tareas únicas se puede realizar utilizando la utilidad at asociada .
Descripción general
Las acciones de cron son impulsadas por un archivo crontab (tabla cron), un archivo de configuración que especifica comandos de shell para ejecutarse periódicamente en un horario determinado. Los archivos crontab se almacenan 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 en todo el sistema (generalmente en /etc
o un subdirectorio de /etc
) que solo los administradores del sistema pueden editar.
Cada línea de un archivo crontab representa un trabajo y tiene este aspecto:
# ┌───────────── minuto (0 - 59)# │ ┌────────────── hora (0-23)# │ │ ┌───────────── día del mes (1 - 31)# │ │ │ ┌───────────── mes (1 - 12)# │ │ │ │ ┌────────────── día de la semana (0 - 6) (domingo a sábado;# │ │ │ │ │ 7 también es domingo en algunos sistemas)# │ │ │ │ │# │ │ │ │ │# * * * * *
La sintaxis de cada línea espera una expresión cron compuesta por 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 "*"), 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 / inicio / oracle / scripts / export_dump.sh
Nota: También es posible especificar */n
a ejecutar para cada n intervalos de tiempo -ésimo. Además, la especificación de múltiples intervalos de tiempo específicos se puede hacer con comas (p 1,2,3
. Ej., ). Lo siguiente generaría "hola mundo" en la línea de comando cada 5 minutos de cada 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 llamando crontab -e
independientemente de dónde la implementación real almacene este archivo.
Algunas cron
implementaciones, como la popular cuarta edición 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 está permitido en las crontabs del sistema, no en otras, que están asignadas a un solo usuario para configurarlas. El sexto campo se usa alternativamente a veces para año en lugar de un nombre de usuario de cuenta; el demonio nncron para Windows hace esto.
La implementación de Amazon EventBridge de cron no utiliza el día de la semana basado en 0, sino que es 1-7 SUN-SAT (en lugar de 0-6). [8]
Definiciones de programación predefinidas no estándar
Algunas implementaciones cron [9] admiten las siguientes macros no estándar:
Entrada | Descripción | Equivalente a |
---|---|---|
@yearly (or @annually) | Ejecutar una vez al año a la medianoche del 1 de enero | 0 0 1 1 * |
@monthly | Ejecutar una vez al mes a la medianoche del primer día del mes | 0 0 1 * * |
@weekly | Ejecutar una vez a la semana a la medianoche del domingo por la mañana | 0 0 * * 0 |
@daily (or @midnight) | Corre una vez al día a medianoche | 0 0 * * * |
@hourly | Ejecutar una vez por hora al comienzo de la hora | 0 * * * * |
@reboot | Ejecutar en el arranque | N / A |
@reboot
configura un trabajo para que se ejecute una vez cuando se inicia el demonio. Dado que cron generalmente nunca se reinicia, esto generalmente corresponde a la máquina que se está iniciando. Este comportamiento se aplica en algunas variaciones de cron, como la proporcionada en Debian , [10] de modo que el simple hecho de reiniciar el demonio no vuelve a ejecutar los @reboot
trabajos.
@reboot
puede ser útil si existe la necesidad de iniciar un servidor o demonio con un usuario en particular, y el usuario no tiene acceso para configurar init para iniciar el programa.
Permisos cron
Estos dos archivos juegan un papel importante:
- /etc/cron.allow : si este archivo existe, debe contener el nombre de usuario para que ese usuario pueda usar trabajos cron.
- /etc/cron.deny : si el archivo cron.allow no existe pero el archivo /etc/cron.deny sí existe, para usar trabajos cron, los usuarios no deben aparecer en el archivo /etc/cron.deny.
Tenga en cuenta que si ninguno de estos archivos existe, 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 cron simplemente interpretan las entradas crontab en la configuración de la zona horaria del sistema bajo la que se ejecuta el demonio cron. Esto puede ser un motivo de disputa si una gran máquina multiusuario tiene usuarios en varias zonas horarias, especialmente si la zona horaria predeterminada del sistema incluye el DST potencialmente confuso . Por lo tanto, una implementación de cron puede, como caso especial, reconocer líneas de la forma "CRON_TZ = [11]
Historia
Versiones tempranas
El cron en la versión 7 de Unix era un servicio del sistema (más tarde llamado demonio ) que se invocaba /etc/rc
cuando el sistema operativo entraba en modo multiusuario. [12] Su algoritmo fue sencillo:
- Leer
/usr/lib/crontab
[13] - Determine si algún comando debe ejecutarse en la fecha y hora actuales y, de ser así, ejecútelo como superusuario , root.
- Duerme un minuto
- Repita desde el paso 1.
Esta versión de cron era básica y robusta, pero también consumía recursos tanto si encontraba trabajo que hacer como si no. En un experimento 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 colocaba demasiada carga en el sistema.
Capacidad multiusuario
La próxima versión de cron, con el lanzamiento de Unix System V , fue creada 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 a Unix tienen procesadores potentes y una pequeña cantidad de usuarios, en ese momento requería un nuevo enfoque en un sistema de un solo 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 controlados por eventos que demostraron " rendimiento superior al de los algoritmos de listas enlazadas simples de uso común ", buen comportamiento dadas las distribuciones de tiempo no uniformes y la complejidad del 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 simuladores de eventos discretos y creó una implementación del administrador de listas de eventos (ELM) de Franta-Maly para la experimentación. Los simuladores de eventos discretos se ejecutan en tiempo virtual , eliminando eventos de la cola de eventos lo más rápido posible y avanzando su noción de "ahora" a la hora programada del próximo evento. La ejecución del simulador de eventos en "tiempo real" en lugar de en tiempo virtual creó una versión de cron que pasó la mayor parte del tiempo durmiendo, esperando el tiempo programado para ejecutar la tarea en el encabezado de la lista de eventos.
El siguiente año escolar trajo nuevos estudiantes al programa de posgrado en Purdue, incluido Keith Williamson, quien se unió al personal de sistemas en el departamento de Ciencias de la Computación. Como una "tarea de preparación", Brown le pidió que desarrollara el cron prototipo en un servicio de producción, y este cron multiusuario entró en uso en Purdue a finales de 1979. Esta versión de cron reemplazó por completo la /etc/cron
que estaba en uso en la computadora. VAX 11/780 del departamento de ciencias con 32 / V.
El algoritmo utilizado por este cron es el siguiente:
- Al iniciar, busque un archivo con el nombre
.crontab
en los directorios de inicio de todos los titulares de cuentas. - Para cada archivo crontab encontrado, determine la próxima vez en el futuro que debe ejecutarse cada comando.
- Coloque esos comandos en la lista de eventos de Franta-Maly con su tiempo correspondiente y su especificador de tiempo de "cinco campos".
- Ingrese al bucle principal:
- Examine la entrada de la tarea al principio de la cola, calcule qué tan lejos debe ejecutarse en el futuro.
- Duerme durante ese período de tiempo.
- Al despertar y luego de verificar la hora correcta, ejecuta la tarea en la cabecera de la cola (en segundo plano) con los privilegios del usuario que la creó.
- Determine la próxima vez en el futuro para ejecutar este comando y vuelva 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 analizar los archivos crontab modificados y programa "eventos de activación " especiales a la hora y media hora para buscar archivos crontab modificados. Se omiten muchos detalles aquí con respecto a las inexactitudes 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 administració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 de crontab.
Los recursos consumidos por esta escala cron solo con la cantidad de trabajo que se le da 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ó a este cron con él. En Bell Labs, él y otros incorporaron el comando Unixat en cron, movieron los archivos crontab fuera de los directorios de inicio de los usuarios (que no eran específicos del host) y en un directorio spool común específico del host, y por necesidad agregaron el crontab
comando para permitir que los usuarios copien sus crontabs en ese directorio de spool.
Esta versión de cron apareció más tarde 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 para estas implementaciones debería ser de la Purdue Research Foundation, que financió el trabajo, pero esto tuvo lugar en un momento en el que se prestaba poca atención a estos asuntos.
Versiones modernas
Con la llegada del Proyecto GNU y Linux , aparecieron nuevos crones. El más común de ellos es el cron de Vixie, originalmente codificado por Paul Vixie en 1987. La versión 3 de cron de Vixie fue lanzada a finales de 1993. La versión 4.1 fue renombrada a ISC Cron y fue lanzada en enero de 2004. 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 e incluyó anacron 2.3 en 2009.
Otras implementaciones populares incluyen anacron y dcron. Sin embargo, anacron no es un programa cron independiente. Otro trabajo cron debe llamarlo. dcron fue creado por Matt Dillon , fundador de DragonFly BSD , y Jim Pryor se hizo cargo de su mantenimiento en 2010. [14]
En 2003, Dale Mellor introdujo mcron, [15] una variante de cron escrita en Guile que proporciona compatibilidad cruzada con cron de Vixie al mismo tiempo que proporciona una mayor flexibilidad, ya que permite utilizar código de esquema arbitrario en la programación de cálculos y definiciones de trabajo. Dado que tanto el demonio mcron como los archivos crontab generalmente se escriben en un esquema (aunque mcron también acepta los 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 los resultados de otros los trabajos cumplen con ciertos criterios. Mcron se implementa de forma predeterminada bajo el administrador de paquetes de Guix , que incluye disposiciones ( servicios ) para que el administrador de paquetes emita monádicamente crontabs de mcron y, al mismo tiempo, garantiza que los paquetes necesarios para la ejecución del trabajo estén instalados y que los crontabs correspondientes se refieran a ellos correctamente. [dieciséis]
Una solución de webcron programa las tareas de anillo para que se ejecuten de forma regular siempre 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 que comprende cinco o seis campos separados por un espacio en blanco [17] que representa un conjunto de tiempos, normalmente como un horario para ejecutar alguna rutina.
Los comentarios comienzan con una marca de comentario # y deben estar en una línea por sí mismos.
Campo | Requerido | Valores permitidos | Caracteres especiales permitidos | Observaciones |
---|---|---|---|---|
Minutos | sí | 0–59 | * , - | |
Horas | sí | 0-23 | * , - | |
Dia del mes | sí | 1-31 | * , - ? L W | ? L W solo en algunas implementaciones |
Mes | sí | 1 a 12 o ENE-DIC | * , - | |
Día de la semana | sí | 0–6 o DOM-SAB | * , - ? L # | ? L # solo en algunas implementaciones |
Año | No | 1970–2099 | * , - | Este campo no es compatible con implementaciones estándar / predeterminadas. |
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), un campo de usuario se inserta antes del comando . Por lo general, se establece en '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. [18]
- Coma (
,
) - Las comas se utilizan para separar elementos de una lista. Por ejemplo, si utiliza "LUN, MIE, VIE" en el quinto campo (día de la semana), significa lunes, miércoles y viernes.
- Guión (
-
) - Dash define rangos. Por ejemplo, 2000-2010 indica todos los años entre 2000 y 2010, inclusive.
- Porcentaje (
%
) - Los signos de porcentaje (%) en el comando, a menos que se escape con 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. [19]
Caracteres no estándar
Los siguientes son caracteres no estándar y existen solo en algunas implementaciones cron, como el programador Quartz Java .
L
- '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 indicado. Como ejemplo, si " 15W "se especifica como el valor para el campo del día del mes, el significado es:" el día de la semana más cercano al día 15 del mes ". Por lo tanto, si el día 15 es sábado, el activador se activa el viernes 14. Si el día 15 es un domingo, el activador se activa el lunes 16. Si el día 15 es un martes, se activa el martes 15. Sin embargo, si se especifica "1W" como valor para el día del mes y el 1er. es un sábado, el activador se activa el lunes 3, ya que no "salta" por encima del 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 lista de días.
- Hash (
#
) - Se permite '#' para el campo del 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. [20] Por ejemplo, ingresar "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 a "?" con la hora de inicio del demonio cron, por lo que
? ? * * * *
se actualizaría a25 8 * * * *
si cron se iniciaba a las 8:25 am, y se ejecutaría a esta hora todos los días hasta que se reiniciara nuevamente. [21]
- Barra oblicua (
/
) - En vixie-cron, las barras inclinadas se pueden combinar con rangos para especificar valores de paso. [9] Por ejemplo, * / 5 en el campo de los minutos indica cada 5 minutos (consulte la nota a continuación sobre las 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 el uso de barras; su fundamento (comentando 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, eso es / 2, / 3, / 4, / 5, / 6, / 10, / 12, / 15, / 20 y / 30 porque 60 es divisible uniformemente por esos números; por horas, eso 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 "restablezca" 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, según el 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 ella y ahora, necesaria para un conteo de frecuencia preciso; en cambio, cron es un mero comparador de patrones).
H
- 'H' se utiliza en el sistema de integración continua de Jenkins 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 en un tiempo no especificado pero invariante 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. [22]
Ver también
- en (comando)
- Lanzado
- Lista de comandos de Unix
- Programación (informática)
- systemd - incorpora cron equivalente (llamado temporizadores )
- fcron
- Programador de tareas de Windows
Referencias
- ^ "¿Diferencia entre cron, crontab y cronjob?" . Desbordamiento de pila .
- ^ "Cron Job: una guía completa para principiantes 2020" . 24 de mayo de 2019.
- ^ "Automatización con trabajo Cron en Centos 8" . 6 de abril de 2020.
- ^ "Crontab - Referencia rápida" . Elección del administrador . 21 de diciembre de 2009.
- ^ "Introducción para principiantes a cron" . Unixgeeks.org . Consultado el 6 de noviembre de 2013 .
- ^ "La respuesta de Kah Seng Tay a ¿Cuál es la etimología de" cron "?" . quora.com. 2019-03-08.
- ^ a b "crontab" , The Open Group Base Specifications Issue 7 - IEEE Std 1003.1, 2013 Edition , The Open Group, 2013 , consultado el 18 de mayo de 2015
- ^ "Programar expresiones para reglas" . Amazonas.
- ^ a b "Manual de formatos de archivo FreeBSD para CRONTAB (5)" . El Proyecto FreeBSD.
- ^ "# 77563 - cron: crontab (5) miente, '@reboot' es cada vez que se reinicia cron, no el sistema" . Sistema de seguimiento de errores de Debian . Consultado el 6 de noviembre de 2013 .
- ^ "crontab (5): tablas para manejar cron - página de manual de Linux" . Linux.die.net . Consultado el 6 de noviembre de 2013 .
- ^ Página de inicio de Minnie http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/etc/rc . Consultado el 12 de septiembre de 2020 . Falta o vacío
|title=
( ayuda ) - ^ Página de inicio de Minnie http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/cron.c . Consultado el 12 de septiembre de 2020 . Falta o vacío
|title=
( ayuda ) - ^ Pryor, Jim (5 de enero de 2010). "Cron" . [email protected] (lista de correo) . Consultado el 6 de noviembre de 2013 .
- ^ Mellor, Dale (1 de junio de 2003). "Mcron - Análisis y requisitos de usuario" . Consultado el 11 de junio de 2019 .
- ^ "Manual de referencia de GNU Guix: 8.8.2 Ejecución de trabajos programados" . GNU Guix. 2019-05-19 . Consultado el 11 de junio de 2019 .
- ^ "Ubuntu Cron Howto" . Help.ubuntu.com. 2013-05-04 . Consultado el 6 de noviembre de 2013 .
- ^ "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 .
- ^ "Referencia crontab de mcron" . Gnu.org . Consultado el 6 de noviembre de 2013 .
- ^ "Guía de integración de Oracle® Role Manager" . Docs.oracle.com . Consultado el 6 de noviembre de 2013 .
- ^ "Formato cron" . nnBackup . Consultado el 27 de mayo de 2014 .
- ^ "Sintaxis del disparador del temporizador" . jenkins.com . Consultado el 16 de febrero de 2018 .
enlaces externos
- : programar trabajo en segundo plano periódico: referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group
- Cron GNU (mcron)
- ISC Cron 4.1
- cronie
- Biblioteca digital de ACM - Franta, Maly, "Una estructura de datos eficiente para el conjunto de eventos de simulación" (requiere suscripción a pubs de ACM)
- Tutorial de sintaxis de Crontab: explicación de la sintaxis de Crontab
- Tutorial cron de UNIX / Linux : un tutorial rápido para sistemas operativos tipo UNIX con scripts de shell de muestra.