GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo uso cron en Linux

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 regularmente) deben ejecutarse durante la noche o los fines de semana, cuando se espera que nadie utilice 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.

En este artículo, presentaré el servicio cron y cómo usarlo.

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.

Uso de crontab

La utilidad cron se ejecuta en función de 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 la secuencia de comandos 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). 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
SHELL=/bin/bash
[email protected]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# backup using the rsbu program to the internal 4TB HDD and then 4TB external
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

# Set the hardware clock to keep it in sync with the more accurate system clock
03 05 * * * /sbin/hwclock --systohc

# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update

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 y 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

Esta línea ejecuta mi propio script de shell Bash, 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

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/2 * * * /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:00 a. m. a 6:00 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

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

Los usuarios habituales con acceso cron podrían cometer errores que, por ejemplo, podrían hacer 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.

El servicio crond 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 se enciende y arranca, 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 regulares 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.

Para obtener más información, las páginas man de cron, crontab, anacron, anacrontab y run-parts tienen excelente información y descripciones de cómo funciona el sistema cron.

Este artículo se publicó originalmente en noviembre de 2017 y se ha actualizado para incluir información adicional.


Linux
  1. Cómo usar BusyBox en Linux

  2. Cómo usar cron en Linux

  3. Cómo usar BUSCAR en Linux

  4. Cómo usar Descomprimir en Linux

  5. Cómo usar el comando Su en Linux

Cómo usar la pantalla de Linux

Cómo listar trabajos cron en Linux

Cómo usar du Command en Linux

Cómo usar la terminal de Linux en Android

Cómo usar el comando sysctl en Linux

Cómo usar el comando de apagado de Linux