GNU/Linux >> Tutoriales Linux >  >> Linux

Programación con cron &At

Introducción

Uno de los desafíos (entre las muchas ventajas) de ser un administrador de sistemas es ejecutar tareas cuando preferiría estar durmiendo. Por ejemplo, algunas tareas (incluidas las que se repiten periódicamente) deben ejecutarse durante la noche o los fines de semana, cuando nadie esperaba utilizar los recursos informáticos. No tengo tiempo que perder por las tardes para ejecutar comandos y scripts que tienen que funcionar fuera del horario laboral. Y no quiero tener que levantarme a las 00:00 para iniciar una copia de seguridad o una actualización importante.

En su lugar, utilizo dos utilidades de servicio que me permiten ejecutar comandos, programas y tareas en momentos predeterminados. El cron y en Los servicios permiten a los administradores de sistemas programar tareas para que se ejecuten en un momento específico en el futuro. El servicio at especifica una tarea única que se ejecuta en un momento determinado. El servicio cron puede programar tareas de forma repetitiva, como diaria, semanal o mensual.

1. cron

El cron es una utilidad de software, ofrecida por un sistema operativo similar a Linux que automatiza la tarea programada en un momento predeterminado. Es un proceso daemon , que se ejecuta como un proceso en segundo plano y realiza las operaciones especificadas en el momento predefinido cuando se activa un determinado evento o condición sin la intervención de un usuario. Tratar con una tarea repetida con frecuencia es una tarea intimidante para el administrador del sistema y, por lo tanto, puede programar dichos procesos para que se ejecuten automáticamente en segundo plano a intervalos regulares de tiempo creando una lista de esos comandos usando cron .

Permite a los usuarios ejecutar la tarea programada de manera regular y discreta, como hacer la copia de seguridad todos los días a la medianoche, programar actualizaciones semanalmente, sincronizar los archivos a intervalos regulares. Cron verifica el trabajo programado de forma recurrente y cuando los campos de tiempo programados coinciden con los campos de tiempo actuales, se ejecutan los comandos programados. Se inicia automáticamente desde /etc/init.d al ingresar a los niveles de ejecución multiusuario.

Usos comunes (y poco comunes) de cron

Yo uso el cron servicio para programar cosas obvias, como copias de seguridad periódicas que se realizan todos los días a las 2 a. m. También lo uso para cosas menos obvias.

  • Las horas del sistema (es decir, la hora del sistema operativo) en muchas de mis computadoras se configuran mediante el Protocolo de tiempo de red (NTP). Si bien NTP establece la hora del sistema, no establece la hora del hardware, que puede variar. Uso cron para configurar la hora del hardware según la hora del sistema.
  • También tengo un programa Bash que ejecuto temprano cada mañana que crea un nuevo "mensaje del día" (MOTD) en cada computadora. Contiene información, como el uso del disco, que debe estar actualizada para ser útil.
  • Muchos procesos y servicios del sistema, como Logwatch, logrotate y Rootkit Hunter, usan el servicio cron para programar tareas y ejecutar programas todos los días.

El crono daemon es el servicio en segundo plano que habilita la funcionalidad cron.

El servicio cron busca archivos en /var/spool/cron y /etc/cron.d directorios y el /etc/anacrontab expediente. El contenido de estos archivos define trabajos cron que se ejecutarán en varios intervalos. Los archivos cron de usuario individuales se encuentran en /var/spool/cron , y los servicios y aplicaciones del sistema generalmente agregan archivos de trabajo cron en el /etc/cron.d directorio. El /etc/anacrontab es un caso especial que se tratará más adelante en este artículo.

Cómo usar cron en Linux

¿No hay tiempo para órdenes? Programar tareas con cron significa que los programas pueden ejecutarse pero no tienes que quedarte despierto hasta tarde.

Usando crontab

La utilidad cron se ejecuta según los comandos especificados en una tabla cron (crontab ). Cada usuario, incluido el root, puede tener un archivo cron. Estos archivos no existen de forma predeterminada, pero se pueden crear en /var/spool/cron directorio usando el crontab -e comando que también se usa para editar un archivo cron (consulte el script a continuación). Le recomiendo encarecidamente que no use un editor estándar (como Vi, Vim, Emacs, Nano o cualquiera de los muchos otros editores disponibles).

Crontab

Usando el crontab comando no solo le permite editar el comando, sino que también reinicia el crond daemon cuando guarda y sale del editor. El crontab El comando usa Vi como su editor subyacente, porque Vi siempre está presente (incluso en las instalaciones más básicas).

Los nuevos archivos cron están vacíos, por lo que los comandos deben agregarse desde cero. Agregué el ejemplo de definición de trabajo a continuación a mis propios archivos cron, solo como una referencia rápida, para saber qué significan las distintas partes de un comando. Siéntase libre de copiarlo para su propio uso.

crontab -e

El

Las tres primeras líneas del código anterior configuran un entorno predeterminado. El entorno debe establecerse en lo que sea necesario para un usuario dado porque cron no proporciona un entorno de ningún tipo. La CONCHA La variable especifica el shell que se usará cuando se ejecuten los comandos. Este ejemplo especifica el shell Bash. El MAILTO La variable establece la dirección de correo electrónico donde se enviarán los resultados del trabajo cron. Estos correos electrónicos pueden proporcionar el estado del trabajo cron (copias de seguridad, actualizaciones, etc.) y consisten en el resultado que vería si ejecutara el programa manualmente desde la línea de comandos. La tercera línea establece el RUTA por el medio ambiente. Aunque la ruta se establece aquí, siempre antepongo la ruta completa a cada ejecutable.

Hay varias líneas de comentarios en el ejemplo anterior que detallan la sintaxis requerida para definir un trabajo cron. Desglosaré esos comandos, luego agregaré algunos más para mostrarle algunas capacidades más avanzadas de los archivos crontab.

01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

Esto

línea ejecuta mi script de shell Bash autoescrito, rsbu , que respalda todos mis sistemas. Este trabajo comienza a la 1:01 a. m. (01 01) todos los días. Los asteriscos (*) en las posiciones tres, cuatro y cinco de la especificación de tiempo son como globos de archivo, o comodines, para otras divisiones de tiempo; especifican "todos los días del mes", "todos los meses" y "todos los días de la semana". Esta línea ejecuta mis copias de seguridad dos veces; una copia de seguridad en un disco duro de copia de seguridad dedicado interno y la otra copia de seguridad en una unidad USB externa que puedo llevar a la caja de seguridad.

La siguiente línea establece el reloj de hardware en la computadora utilizando el reloj del sistema como fuente de una hora precisa. Esta línea está configurada para funcionar a las 5:03 a. m. (03 05) todos los días.

03 05 * * * /sbin/hwclock --systohc

Estaba usando el tercer y último trabajo cron (comentado) para realizar un dnf o mmm actualización a las 04:25 a. m. del primer día de cada mes, pero lo comenté para que ya no se ejecute.

25 04 1 * * /usr/bin/dnf -y update

Otros trucos de programación

Ahora hagamos algunas cosas que son un poco más interesantes que estos conceptos básicos. Suponga que desea ejecutar un trabajo en particular todos los jueves a las 3:00 p. m.:

00 15 * * Thu /usr/local/bin/mycronjob.sh

O tal vez necesite ejecutar informes trimestrales después del final de cada trimestre. El servicio cron no tiene opción para "El último día del mes", por lo que puede usar el primer día del mes siguiente, como se muestra a continuación. (Esto supone que los datos necesarios para los informes estarán listos cuando el trabajo esté configurado para ejecutarse).

02 03 1 1,4,7,10 * /usr/local/bin/reports.sh

A continuación se muestra un trabajo que se ejecuta un minuto después de cada hora entre las 9:01 a. m. y las 5:01 p. m.

01 09-17 * * * /usr/local/bin/hourlyreminder.sh

Yo

Me he encontrado con situaciones en las que necesito ejecutar un trabajo cada dos, tres o cuatro horas. Eso se puede lograr dividiendo las horas por el intervalo deseado, como */3 por cada tres horas, o 6-18/3 para funcionar cada tres horas entre las 6 a. m. y las 6 p. m. Otros intervalos se pueden dividir de manera similar; por ejemplo, la expresión */15 en la posición de minutos significa "ejecutar el trabajo cada 15 minutos".

*/5 08-18/* * * /usr/local/bin/mycronjob.sh

Una cosa a tener en cuenta :Las expresiones de división deben dar como resultado un resto de cero para que se ejecute el trabajo. Por eso, en este ejemplo, el trabajo está configurado para ejecutarse cada cinco minutos (08:05, 08:10, 08:15, etc.) durante las horas pares de 8 a. m. a 6 p. m., pero no durante las horas impares. horas numeradas. Por ejemplo, el trabajo no se ejecutará desde las 9 p.m. a las 9:59 a. m.

Estoy seguro de que puedes encontrar muchas otras posibilidades basadas en estos ejemplos.

Limitación del acceso cron

Los usuarios regulares con acceso cron podrían cometer errores que, por ejemplo, podrían causar que los recursos del sistema (como la memoria y el tiempo de CPU) se inunden. Para evitar un posible uso indebido, el administrador del sistema puede limitar el acceso de los usuarios creando un /etc/cron.allow archivo que contiene una lista de todos los usuarios con permiso para crear trabajos cron. No se puede evitar que el usuario root use cron.

Al evitar que los usuarios no root creen sus propios trabajos cron, puede ser necesario que el usuario root agregue sus trabajos cron a la tabulación de root. "¡Pero espera!" tu dices. "¿Eso no ejecuta esos trabajos como root?" No necesariamente. En el primer ejemplo de este artículo, el campo de nombre de usuario que se muestra en los comentarios se puede usar para especificar el ID de usuario que debe tener un trabajo cuando se ejecuta. Esto evita que los trabajos del usuario no root especificado se ejecuten como root. El siguiente ejemplo muestra una definición de trabajo que ejecuta un trabajo como el usuario "estudiante":

04 07 * * * student /usr/local/bin/mycronjob.sh

Si no se especifica ningún usuario, el trabajo se ejecuta como el usuario propietario del archivo crontab, root en este caso.

cron.d

El directorio /etc/cron.d es donde algunas aplicaciones, como spamAssassin y sysstat, instalan archivos cron. Debido a que no hay un usuario de spamassassin o sysstat, estos programas necesitan un lugar para ubicar los archivos cron, por lo que se ubican en /etc/cron.d .

El /etc/cron.d/sysstat El siguiente archivo contiene trabajos cron relacionados con los informes de actividad del sistema (SAR). Estos archivos cron tienen el mismo formato que un archivo cron de usuario.

# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

El archivo cron de sysstat tiene dos líneas que realizan tareas. La primera línea ejecuta sa1 programa cada 10 minutos para recopilar datos almacenados en archivos binarios especiales en el /var/log/sa directorio. Luego, todas las noches a las 23:53, el sa2 el programa se ejecuta para crear un resumen diario.

Consejos de programación

Algunas de las horas que configuro en los archivos crontab parecen bastante aleatorias, y hasta cierto punto lo son. Intentar programar trabajos cron puede ser un desafío, especialmente a medida que aumenta la cantidad de trabajos. Por lo general, solo tengo algunas tareas para programar en cada una de mis computadoras, lo cual es más simple que en algunos de los entornos de producción y laboratorio donde he trabajado.

Un sistema que administré tenía alrededor de una docena de trabajos cron que se ejecutaban todas las noches y tres o cuatro adicionales que se ejecutaban los fines de semana o el primer día del mes. Eso fue un desafío, porque si se ejecutaban demasiados trabajos al mismo tiempo, especialmente las copias de seguridad y las compilaciones, el sistema se quedaba sin RAM y casi llenaba el archivo de intercambio, lo que provocaba que el sistema fallara mientras el rendimiento se desplomaba, por lo que no se hizo nada. Agregamos más memoria y mejoramos la forma en que programamos las tareas. También eliminamos una tarea que estaba muy mal escrita y usaba grandes cantidades de memoria.

La croda

El servicio asume que la computadora host se ejecuta todo el tiempo. Eso significa que si la computadora se apaga durante un período en el que los trabajos cron estaban programados para ejecutarse, no se ejecutarán hasta la próxima vez que estén programados. Esto podría causar problemas si son trabajos cron críticos. Afortunadamente, existe otra opción para ejecutar trabajos a intervalos regulares:anacron .

anacron

El programa anacron realiza la misma función que crond, pero agrega la capacidad de ejecutar trabajos que se omitieron, como si la computadora estuviera apagada o no pudiera ejecutar el trabajo durante uno o más ciclos. Esto es muy útil para computadoras portátiles y otras computadoras que están apagadas o puestas en modo de suspensión.

Tan pronto como

la computadora está encendida y arrancada, anacron verifica si los trabajos configurados perdieron su última ejecución programada. Si es así, esos trabajos se ejecutan de inmediato, pero solo una vez (sin importar cuántos ciclos se hayan perdido). Por ejemplo, si un trabajo semanal no se ejecutó durante tres semanas porque el sistema se apagó mientras estaba de vacaciones, se ejecutaría poco después de encender la computadora, pero solo una vez, no tres veces.

El programa anacron proporciona algunas opciones sencillas para ejecutar tareas programadas con regularidad. Simplemente instale sus scripts en /etc/cron.[hourly|daily|weekly|monthly] directorios, según la frecuencia con la que deben ejecutarse.

¿Como funciona esto? La secuencia es más simple de lo que parece a primera vista.

  1. El servicio crond ejecuta el trabajo cron especificado en /etc/cron.d/0hourly .
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

  1. El trabajo cron especificado en /etc/cron.d/0hourly ejecuta run-parts programa una vez por hora.
  2. Las piezas de ejecución El programa ejecuta todos los scripts ubicados en /etc/cron.hourly directorio.
  3. El /etc/cron.hourly directorio contiene el 0anacron script, que ejecuta el programa anacron utilizando /etdc/anacrontab archivo de configuración que se muestra aquí.
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
                                                               
#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

  1. El programa anacron ejecuta los programas ubicados en /etc/cron.daily una vez al día; ejecuta los trabajos ubicados en /etc/cron.weekly una vez por semana, y los trabajos en cron.monthly Una vez al mes. Tenga en cuenta los tiempos de retraso especificados en cada línea que ayudan a evitar que estos trabajos se superpongan entre sí y con otros trabajos cron.

En lugar de colocar programas Bash completos en el cron.X directorios, los instalo en el /usr/local/bin directorio, lo que me permite ejecutarlos fácilmente desde la línea de comandos. Luego agrego un enlace simbólico en el directorio cron apropiado, como /etc/cron.daily .

El programa anacron

no está diseñado para ejecutar programas en momentos específicos. Más bien, está diseñado para ejecutar programas a intervalos que comienzan a las horas especificadas, como las 3 a. m. (consulte el START_HOURS_RANGE línea en el guión justo arriba) de cada día, el domingo (para comenzar la semana) y el primer día del mes. Si se pierden uno o más ciclos, anacron ejecutará los trabajos perdidos una vez, tan pronto como sea posible.

Atajos

El /etc/anacrontab El archivo que se muestra arriba nos muestra una pista de cómo podemos usar atajos para algunos momentos específicos y comunes. Estos atajos de tiempo de una sola palabra se pueden usar para reemplazar los cinco campos que generalmente se usan para especificar tiempos. El @ El carácter se usa para identificar accesos directos a cron. La siguiente lista, tomada de la página del manual crontab(5), muestra los atajos con sus significados equivalentes.

  • @reboot :Ejecutar una vez después de reiniciar.
  • @yearly :ejecutar una vez al año, es decir. 0 0 1 1 *
  • @annually:ejecutar una vez al año, es decir. 0 0 1 1 *
  • @monthly :Ejecutar una vez al mes, es decir. 0 0 1 * *
  • @weekly :Ejecutar una vez a la semana, es decir. 0 0 * * 0
  • @daily:Ejecutar una vez al día, es decir. 0 0 * * *
  • @hourly :Ejecutar una vez por hora, es decir. 0 * * * *

Estos accesos directos se pueden usar en cualquiera de los archivos crontab, como los de /etc/cron.d .

Más información sobre el establecimiento de límites

Utilizo la mayoría de estos métodos para programar tareas para que se ejecuten en mis computadoras. Todas esas tareas son las que deben ejecutarse con privilegios de root. En mi experiencia, es raro que los usuarios habituales realmente necesiten un trabajo cron. Un caso fue el de un usuario desarrollador que necesitaba un trabajo cron para iniciar una compilación diaria en un laboratorio de desarrollo.

Es importante restringir el acceso a las funciones cron por parte de usuarios no root. Sin embargo, hay circunstancias en las que un usuario necesita configurar una tarea para que se ejecute en momentos predeterminados, y cron puede permitírselo. Muchos usuarios no entienden cómo configurar correctamente estas tareas usando cron y cometen errores. Esos errores pueden ser inofensivos, pero, la mayoría de las veces, pueden causar problemas. Al establecer políticas funcionales que hacen que los usuarios interactúen con el administrador del sistema, es mucho menos probable que los trabajos cron individuales interfieran con otros usuarios y otras funciones del sistema.

Es posible establecer límites en el total de recursos que se pueden asignar a usuarios individuales o grupos, pero ese es un artículo para otro momento.

Puntos importantes

Sintaxis de cron:

cron [-f] [-l] [-L loglevel]

Opciones:

  • -f : Se utiliza para permanecer en modo de primer plano y no demonizar.
  • -l: Esto habilitará los nombres compatibles con LSB para los archivos /etc/cron.d.
  • -n: Se usa para agregar el FQDN en el asunto al enviar correos.
  • -L nivel de registro: Esta opción le dirá al cron qué registrar sobre los trabajos con los siguientes valores:
    • 1 : Registrará el inicio de todos los trabajos cron.
    • 2 : Registrará el final de todos los trabajos cron.
    • 4 : Registrará todos los trabajos fallidos. Aquí el estado de salida no será igual a cero.
    • 8 : Registrará el número de proceso de todos los trabajos cron.

El crontab (abreviatura de "tabla cron") es una lista de comandos para ejecutar las tareas programadas en un momento específico. Permite al usuario agregar, quitar o modificar las tareas programadas. La sintaxis del comando crontab tiene seis campos separados por espacios donde los primeros cinco representan el tiempo para ejecutar la tarea y el último es para el comando.

  • Minuto (tiene un valor entre 0-59)
  • Hora (mantiene un valor entre 0 y 23)
  • Día del mes (mantiene un valor entre 1 y 31)
  • Mes del año (tiene un valor entre 1-12 o enero-diciembre, se utilizarán las tres primeras letras del nombre del mes)
  • Día de la semana (tiene un valor entre 0-6 o Sun-Sat, aquí también se utilizarán las tres primeras letras del día)
  • Comando
Las reglas que rigen el formato del campo de fecha y hora son las siguientes:
  • Cuando cualquiera de los primeros cinco campos se configura con un asterisco (*), representa todos los valores del campo. Por ejemplo, para ejecutar un comando diariamente, podemos poner un asterisco (*) en el campo de la semana.
  • También se puede usar un rango de números, separados con un guión (-) en el campo de hora y fecha para incluir más de un valor contiguo pero no todos los valores del campo. Por ejemplo, podemos usar el 7-10 para ejecutar un comando de julio a octubre.
  • El operador de coma (, ) se usa para incluir una lista de números que pueden o no ser consecutivos. Por ejemplo, "1, 3, 5" en el campo de las semanas significa la ejecución de un comando todos los lunes, miércoles y viernes.
  • Se incluye un carácter de barra inclinada (/) para omitir una determinada cantidad de valores. Por ejemplo, "*/4" en el campo de la hora especifica "cada 4 horas", lo que equivale a 0, 4, 8, 12, 16, 20.
Permitir a los usuarios ejecutar trabajos cron:
  • El usuario debe estar incluido en este archivo para poder ejecutar trabajos cron si el archivo existe.
/etc/cron.allow
  • Si el archivo cron.allow no existe pero existe el archivo cron.deny, entonces un usuario no debe estar incluido en este archivo para poder ejecutar el trabajo cron.
/etc/cron.deny

Nota: Si ninguno de estos archivos existe, solo el superusuario (administrador del sistema) podrá usar un comando determinado.
Comandos de muestra:

  • /home/folder/gfg-code.sh cada hora, de 9:00 a. m. a 6:00 p. m., todos los días.
00 09-18 * * * /home/folder/gfg-code.sh
  • /usr/local/bin/backup a las 23:30, todos los días laborables.
30 23 * * Mon, Tue, Wed, Thu, Fri /usr/local/bin/backup
  • Ejecute sample-command.sh a las 07:30, 09:30, 13:30 y 15:30.
30 07, 09, 13, 15 * * * sample-command.sh

Se deben recordar los siguientes puntos al trabajar con cron:

  • Tenga un control de versiones de código fuente para rastrear y mantener los cambios en las expresiones cron.
  • Organiza los trabajos programados según su importancia o la frecuencia y agrúpalos por su acción o el rango de tiempo.
  • Pruebe el trabajo programado teniendo una alta frecuencia inicialmente.
  • No escriba código complejo o varias canalizaciones y redirección en la expresión cron directamente. En su lugar, escríbalos en un script y programe el script en la pestaña cron.
  • Utilice alias cuando el mismo conjunto de comandos se repite con frecuencia.
  • Evite ejecutar comandos o scripts a través de cron como usuario raíz.

2. en

al mando es una utilidad de línea de comandos que se utiliza para programar un comando para que se ejecute en un momento determinado en el futuro. Trabajos creados con al mando se ejecutan una sola vez. El al mando se puede utilizar para ejecutar cualquier programa o correo en cualquier momento en el futuro. Ejecuta comandos a una hora determinada y acepta horas de la forma HH:MM para ejecutar un trabajo a una hora específica del día. La siguiente expresión como mediodía, medianoche, hora del té, mañana, la próxima semana, el próximo lunes, etc. podría usarse con al mando para programar un trabajo.

Sintaxis:

at [OPTION...] runtime

Instalación de a la orden

Para Ubuntu/Debian:

sudo apt-get update
sudo apt-get install at

Para CentOS/Fedora:

sudo yum install at

Trabajar con al mando

1. Comando para listar los trabajos pendientes del usuario:

at -l

o

atq

2. Programe un trabajo para el próximo lunes a una hora veinte minutos más tarde que la hora actual:

at Monday +20 minutes

3. Programe un trabajo para que se ejecute a la 1:45 del 12 de agosto de 2020:

at 1:45 081220

4. Programe un trabajo para que se ejecute a las 3:00 p. m. dentro de cuatro días:

at 3pm + 4 days

5. Programe un trabajo para apagar el sistema hoy a las 4:30:

# echo "shutdown -h now" | at -m 4:30

6. Programe un trabajo para que se ejecute dentro de cinco horas:

at now +5 hours

7. El comando at -r o atrm se usa para eliminar el trabajo, aquí se usa para eliminar el trabajo 11.

 at -r 11

o

atrm 11

Linux
  1. Programación de tareas con el comando cron de Linux

  2. Programar una tarea con Linux al mando

  3. Administre NTP con Chrony

  4. ¿Hora de inicio del proceso con zona horaria?

  5. Obtenga el tiempo de creación de archivos con Python en Linux

Programación de trabajos de Cron con Crontab

Marcas de tiempo de archivos de Linux explicadas con ejemplos

Seguimiento del tiempo con Timewarrior en la línea de comandos

Cómo automatizar tareas con trabajos cron en Linux

Entendiendo Crontab en Linux con ejemplos

Ejecutar comandos con límite de tiempo en Ubuntu 20.04