Cómo usar el comando crontab en Unix

Los trabajos cron son actividades programadas en sistemas similares a Unix. En este artículo, utilizará el comando crontab para agregar y administrar trabajos cron en Linux.

Introducción

Al administrar una computadora, es posible que queramos automatizar algunas tareas para que se ejecuten en ciertos períodos o al mismo tiempo cada día/semana/mes. En una computadora de escritorio, podemos programar comprobaciones de actualizaciones o análisis de virus. En un servidor, no es raro que se programen una gran cantidad de comprobaciones y rutinas de limpieza para garantizar que las aplicaciones funcionen de manera óptima.

En este artículo, veremos el programa cron. Esta utilidad es un programador de tareas para sistemas tipo Unix. Después de repasar los conceptos básicos de cron, veremos el comando crontab para administrar nuestras tareas programadas.

¿Qué es Cron? ¿Qué es un Crontab?

Para dominar cron y la programación, es útil tener una comprensión de la terminología utilizada, pero similar.

Cron es el programa que programa scripts o comandos para que se ejecuten en momentos especificados por el usuario. Una expresión cron es una cadena que detalla la programación para activar un comando. Una tabla cron es un archivo de configuración que contiene los comandos de shell en cada línea precedida por una expresión cron.

Aquí hay una imagen con un sistema crontab que hace referencia a dos scripts externos:

Editing the crontabs directly

En general, las tablas cron se ven así:

1
2
<cron-expression> <command>
<cron-expression> <command>

Cuando su computadora se inicia por primera vez, cron busca todos los crontabs en los directorios configurados del sistema. El directorio varía de un sistema operativo a otro, pero normalmente es /etc/crontab para crontabs especiales de todo el sistema y un directorio local para el usuario que ha iniciado sesión. Ambos se cargan en la memoria.

El programa cron se activa cada minuto y verifica el crontab en la memoria para ver si es necesario ejecutar algún comando en el minuto actual. Ejecuta todos los comandos programados y vuelve a dormir.

Hay dos métodos mediante los cuales se pueden programar los trabajos cron:

  1. Edite el crontab directamente

Podemos ver los trabajos cron que hemos programado ejecutando este comando:

1
$ crontab -l

Si deseamos agregar o editar un trabajo cron, podemos usar este comando:

1
$ crontab -e

Este es el método preferido para editar crontabs porque selecciona el crontab del usuario y no el del sistema, y ​​también detecta errores de sintaxis.

  1. Copiar los scripts a los directorios /etc/cron.***

Si no se requiere programar los scripts para intervalos de tiempo precisos, los scripts también se pueden mover dentro de ciertas carpetas de programación cron preconstruidas, para que crontab los recoja para su ejecución. Estos directorios predefinidos que actúan como marcadores de posición incluyen:

Cronograma de ejecución de la ubicación


/etc/cron.hourly/ Una vez cada hora /etc/cron.daily/ Una vez al día, todos los días /etc/cron.monthly/ Una vez al mes, todos los meses /etc/cron.weekly/ Una vez por semana, cada semana

Los usuarios pueden copiar sus scripts en los directorios apropiados según la frecuencia con la que necesiten ejecutarse. El archivo crontab presente en /etc/crontab contiene las expresiones cron definidas para cada directorio y verifica cada minuto si es el momento adecuado para ejecutar los scripts:

Copying scripts to the corresponding /etc/cron.\* directories

Tenga en cuenta que los scripts colocados en estas carpetas especiales son trabajos cron de todo el sistema y no específicos del usuario.

Creación de una expresión cron

Cada entrada del crontab contiene una expresión cron, un nombre de usuario y el comando a ejecutar separados por espacios en blanco o tabuladores:

1
2
3
4
  *  *  *  *  * user-name command-or-file-to-be-executed
# <-----------> <-------> <---------------------------->
#      Cron
#   Expression

Nota: La columna nombre de usuario se utiliza al editar el crontab de todo el sistema. Un crontab específico del usuario no lo necesita porque esa información ya se conoce.

Los 5 asteriscos (* * * * *) en la expresión cron se pueden sustituir por números. Sus posiciones indican su valor:

* Posición Descripción Valores numéricos permitidos


1 minuto 0-59 2 horas 0-23 3 Día del mes 1-31 4 meses 0-12 5 Día de la semana [0 representa domingo y sábado representa 6] 0-6

Además de los números, hay caracteres especiales que podemos usar al editar un crontab:

Personajes Descripción


* Definir esto ejecutará el comando para cada período de tiempo. Por ejemplo, * definido en la columna de minutos, ejecutará el script cada minuto , Para repetir una tarea en múltiples marcos de tiempo diferentes, se pueden usar comas. Por ejemplo, para ejecutar un script cada 10 minutos, la columna de minutos se puede dar como 0,10,20,30,40,50 / Una versión alternativa y más simple de ",". Para ejecutar un script cada 10 minutos, la columna de minutos se puede dar como */10 - Especifica un rango de valores. Para ejecutar un script cada minuto durante los primeros 10 minutos, la expresión en la columna de minutos se puede dar como: 0-10

Esas son muchas opciones para entender, sería mejor mostrar cómo funcionan con algunos ejemplos:

  1. A continuación se explica cómo ejecutar echo "¡hola!" el "4º día de cada semana" (es decir, el jueves) a las 12:10 horas:
1
10 12 * * 4 root echo "hello there!"
  1. Y aquí hay un ejemplo más complicado donde ahorramos el uso del disco cada 20 minutos en los primeros 10 días de los últimos tres meses del año:
1
*/20 * 1-10 10,11,12 * df -h >> /tmp/diskusage

Las expresiones de Cron pueden ser abrumadoras a primera vista. Existen numerosas herramientas disponibles en línea para simplificar la creación de expresiones; crontab.guru es una de las herramientas más populares disponibles en línea en https://crontab.guru/.

Usemos crontab.guru para verificar si nuestro segundo expreso es válido: https://crontab.guru/#*/20_*_1-10_10,11,12_*.

Copying scripts to the corresponding /etc/cron.\* directories

Guía práctica: creación de un trabajo cron para el uso de disco y memoria por correo electrónico

En un departamento de TI, los administradores de sistemas y otros operadores supervisan con frecuencia los recursos informáticos, como la memoria y el tamaño del disco. Crontab se usa comúnmente para garantizar que los scripts de monitoreo se ejecuten continuamente.

Vamos a crear un trabajo cron que monitorea el uso del disco y la RAM usando vigilante. Si cualquiera de las métricas está por encima de cierto umbral, recibiremos un correo electrónico para avisarnos. Pondremos este script en un trabajo cron que se ejecuta cada minuto.

La siguiente demostración se probó en Ubuntu 20.04.1 LTS. Este ejemplo está configurado para enviar un correo electrónico a una cuenta de Gmail, es posible que deba modificar sus configuraciones para otros proveedores de correo electrónico.

  • Primero necesitas instalar watchmon. Siga su LÉAME para aprender a configurarlo:
1
2
3
> git clone https://github.com/datawrangl3r/watchmon
> cd watchmon
> bash setup.sh
  • El script iniciará el proceso cron, instalará http://www.mutt.org/, un cliente SMTP de línea de comandos, para enviar correos electrónicos. Una vez instalado, use su editor de texto para el archivo mutt.rc en su directorio de inicio: /home/user/mutt/mutt.rc.

Edite su archivo para que se vea así, cambiando los datos de la plantilla con su correo electrónico:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
set ssl_starttls=yes
set ssl_force_tls=yes

set imap_user = "[correo electrónico protegido]"
set imap_pass = "PASSWORD"

set from="[correo electrónico protegido]"
set realname="Your Name"

set folder = "imaps://imap.gmail.com/"
set spoolfile = "imaps://imap.gmail.com/INBOX"
set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"

set header_cache = "~/.mutt/cache/headers"
set message_cachedir = "~/.mutt/cache/bodies"
set certificate_file = "~/.mutt/certificates"

set smtp_url = "smtps://[correo electrónico protegido]:[correo electrónico protegido]:465/"

set move = no
set imap_keepalive = 900
  • Dado que Google no permite que aplicaciones menos seguras accedan a sus servicios, debemos habilitar el acceso para que la cuenta de correo electrónico se use en la configuración de SMTP. Visite https://micuenta.google.com/seguridad y active el acceso a aplicaciones menos seguras, como se muestra en el siguiente gif:

Permitiendo el acceso a las aplicaciones menos seguras en gmail

  • Ahora que nuestras secuencias de comandos y configuraciones de cuentas de correo electrónico están listas, podemos configurar nuestro crontab. Edite su crontab invocando:
1
$ crontab -e

Ahora ingrese la expresión cron correspondiente y la ruta al ejecutable con argumentos. Tenga en cuenta que la ruta en su máquina diferirá de lo que se muestra a continuación:

1
* * * * * /mnt/c/Users/sathy/Documents/datawrangler/watchmon/watchmon.sh -t=40 [correo electrónico protegido]

Esto se puede configurar como se muestra a continuación:

Figura 5: Permitir el acceso a las aplicaciones menos seguras en gmail

La utilidad cron se asegura de ejecutar el script cada minuto y, como resultado, se envía un correo electrónico desde la máquina a los destinatarios hasta que se vacía el espacio en disco o la memoria de la máquina.

Trabajos cron y manejo de fallas

Aunque los crontabs son muy potentes, no pueden alertar al usuario si no se activa un trabajo subyacente o si el ejecutable programado encuentra un error. Los registros de cada ejecución de trabajo se pueden encontrar en el archivo /var/log/syslog. Asegúrese de revisar sus registros después de programar las actividades.

Aparte de los errores de cron y de comando, muchos crontabs están plagados de errores humanos. Al configurar trabajos cron, aquí hay algunas razones comunes por las que su trabajo cron puede no ejecutarse como esperaría:

  • Los scripts no tienen permiso de ejecución. Los ejecutables que se ejecutarán como trabajos cron deben tener el permiso 755, es decir, rwx-rw-rw. La utilidad cron solo puede ejecutar scripts si el usuario tiene permisos de ejecución para ello.

  • El crontab es sintácticamente correcto, pero se utilizó la ruta incorrecta para los trabajos. Es importante especificar la ruta absoluta al ejecutable y el comando en sí. Las rutas relativas deben evitarse a toda costa.

  • El comando o script no se está ejecutando con las variables de entorno necesarias para funcionar. En estos casos, asegúrese de que el script que ejecute pueda configurar las variables de entorno requeridas cuando se ejecuta como un trabajo cron.

Conclusión

En este artículo, hemos analizado el programa cron, las expresiones cron y los crontabs. Usamos el comando crontab para enumerar y editar trabajos cron. Los crontabs son algunas de las mejores herramientas para sistemas similares a Unix para automatizar tareas repetitivas. ¿Qué programarías con un trabajo cron? rabajo cron?