Tutorial

Cómo usar Cron para automatizar tareas en Ubuntu 18.04

System ToolsUbuntu 18.04

Shaun Lewis escribió una versión anterior de este tutorial.

Introducción

Cron es un demonio de programación de tareas basado en el tiempo que se encuentra en sistemas operativos similares a Unix, incluso en distribuciones de Linux. Se ejecuta en segundo plano y las tareas programadas con él, llamadas “tareas de Cron”, se ejecutan de forma automática, lo cual hace que este demonio sea útil para automatizar tareas relacionadas con el mantenimiento.

En esta guía se ofrece una descripción general de cómo programar tareas usando la sintaxis especial de Cron. También se repasan algunos accesos directos que se pueden usar para facilitar la escritura y la comprensión de la programación de tareas.

Requisitos previos

Para completar esta guía, necesitará acceso a una computadora con Ubuntu 18.04. Puede usar su máquina local, una máquina virtual o un servidor virtual privado.

Independientemente del tipo de computadora que utilice para seguir esta guía, debe disponer de un usuario no root con privilegios administrativos configurado. Para configurarlo, siga nuestra Guía de configuración inicial de servidores para Ubuntu 18.04.

Instalar Cron

Casi todas las distribuciones de Linux tienen alguna forma de Cron instalada por defecto. Sin embargo, si utiliza una máquina de Ubuntu que no tiene instalado Cron, puede instalarlo usando APT.

Antes de instalar Cron en una máquina con Ubuntu, actualice el índice de paquetes locales de esta:

  • sudo apt update

Luego, instale Cron con el siguiente comando:

  • sudo apt install cron

Deberá asegurarse de que esté configurado para ejecutarse en segundo plano:

  • sudo systemctl enable cron
Output
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable cron

Una vez hecho eso, Cron quedará instalado en su sistema y listo para comenzar a programar tareas.

Información sobre el funcionamiento de Cron

Las tareas de Cron se registran y administran en un archivo especial llamado crontab. Cada perfil de usuario del sistema puede tener su propio crontab para programar tareas, que se almacenan en /var/spool/cron/crontabs.

Para programar una tarea, simplemente debe abrir su crontab a fin de editar y añadir una tarea escrita en forma de expresión de Cron. La sintaxis para escribir expresiones de Cron puede dividirse en dos elementos: la programación y el comando de ejecución.

El comando puede ser prácticamente cualquiera que ejecute habitualmente en la línea de comandos. El componente de programación de la sintaxis se divide en 5 campos distintos, que se escriben en el siguiente orden:

Campo Valores permitidos
minute 0-59​​​
hour 0-23
Day of the month 1-31
month 1-12 o JAN-DEC
Day of the week 0-6 o SUN-SAT

Juntas, las tareas programadas en una crontab se estructuran de la siguiente manera:

minute hour day_of_month month day_of_week command_to_run

A continuación, se ofrece un ejemplo funcional de una expresión de Cron. Esta expresión ejecuta el comando curl http://www.google.com cada martes a las 5:30 p. m.:

30 17 * * 2 curl http://www.google.com

También puede incluir ciertos caracteres especiales en el componente de programación de una expresión de Cron para facilitar la programación:

  • *: en las expresiones de Cron, el asterisco es la variable comodín que representa “todo”. Por lo tanto, una tarea programada con * * * * * ... se ejecutará cada minuto de cada hora de cada día de cada mes.
  • ,: las comas separan los valores de programación para crear una lista. Si desea que una tarea se ejecute al comienzo y a la mitad de cada hora, en lugar de escribir dos tareas separadas (por ejemplo, 0 * * * * ... y 30 * * * * ...​), podría lograr la misma funcionalidad con una sola (0,30 * * * * ...).
  • -: el guión representa una variedad de valores en el campo de programación. En lugar de tener 30 tareas programadas por separado para un comando que desee ejecutar durante los primeros 30 minutos de cada hora (como en el caso de 0 * * * * ..., 1 * * * * ... y 2 * * * * ..., entre otros), podría programarlo con el valor 0-29 * * * * ....
  • /: puede usar una barra diagonal con un asterisco para expresar un valor de paso. Por ejemplo, en lugar de escribir ocho tareas de Cron separadas para ejecutar un comando cada tres horas (como en el caso de 0 0 * * * ..., 0 3 * * * ... y 0 6 * * * ..., entre otros), podría programarlo con el siguiente valor: 0 */3 * * * ....

Nota: No puede expresar valores de paso de forma arbitraria; solo puede usar enteros que se dividan de manera uniforme en el intervalo que permita el campo en cuestión. Por ejemplo, en el campo “hours”, solo pueden seguir a la barra diagonal los números 1, 2, 3, 4, 6, 8 o 12.

A continuación, se muestran algunos ejemplos más relacionados con el uso del componente de programación de Cron:

  • * * * * *: ejecuta el comando a cada minuto.
  • 12 * * * *: ejecuta el comando 12 minutos después de cada hora.
  • 0,15,30,45 * * * *: ejecuta el comando cada 15 minutos.
  • */15 * * * *: ejecuta el comando cada 15 minutos.
  • 0 4 * * *: ejecuta el comando todos los días a las 4:00 a. m.
  • 0 4 * * 2-4: ejecuta el comando todos los martes, miércoles y jueves a las 4 a. m.
  • 20,40 */8 * 7-12 *: ejecuta el comando en los minutos 20 y 40 de cada octava hora todos los días de los últimos 6 meses del año.

Si algo de esto le parece confuso o necesita ayuda para escribir la programación de sus propias tareas de Cron, Cronitor ofrece un editor de expresiones de programación de Cron práctico denominado “Crontab Guru” que puede utilizar para verificar si sus programaciones de Cron son válidas.

Administrar crontabs

Una vez que haya definido una programación y sepa la tarea que desea ejecutar, deberá disponerla en un sitio en el que su demonio pueda leerla.

Como se mencionó anteriormente, crontab es un archivo especial que contiene la programación de tareas que ejecutará Cron. Sin embargo, estas no están diseñadas para editarse de forma directa. Como alternativa, se recomienda usar el comando crontab. Esto le permite editar el crontab de su perfil de usuario sin modificar sus privilegios con sudo. El comando crontab también le permite saber si el crontab contiene errores de sintaxis, beneficio del que no dispone con la edición directa.

Puede editar su crontab con el siguiente comando:

  • crontab -e

La primera vez que ejecute el comando crontab en un perfil de usuario, le solicitará seleccionar un editor de texto predeterminado al editar su crontab:

Output
no crontab for sammy - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]:

Ingrese el número correspondiente al editor que prefiera. También puede presionar ENTER para aceptar la opción predeterminada: nano.

Una vez que realice su selección, accederá a un nuevo crontab que contiene algunas instrucciones con comentarios sobre cómo usarlo:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Cuando ejecute crontab -e en el futuro, mostrará su crontab en este editor de texto de forma automática. Cuando se encuentre en el editor, podrá ingresar su programación con cada tarea en una nueva línea. También puede guardar y cerrar el crontab por ahora (CTRL + X, Y, y luego ENTER si seleccionó nano).

Nota: En sistemas basados en Linux, hay otro crontab almacenado en el directorio /etc/. Es un crontab que se aplica a todo el sistema que cuenta con un campo adicional para el perfil de usuario en el que se debe ejecutar cada tarea de Cron. Este tutorial se centra en crontabs específicos de usuarios, pero si desea editar el crontab que se aplica a todo el sistema, puede hacerlo con el siguiente comando:

  • sudo nano /etc/crontab

Si desea ver el contenido de su crontab, pero no editarlo, puede usar este comando:

  • crontab -l

Puede eliminar su crontab con el siguiente comando:

Advertencia: Este comando no le solicitará confirmar la eliminación de su crontab. Ejecútelo únicamente si está seguro de que desea eliminarlo.

  • crontab -r

Con este comando se eliminará el crontab del usuario de forma inmediata. Sin embargo, puede incluir el indicador -i para que el comando le solicite confirmar si realmente desea eliminar el crontab del usuario:

  • crontab -r -i
Output
crontab: really delete sammy's crontab? (y/n)

Cuando se solicite, deberá ingresar y para eliminar el crontab o n para cancelar la eliminación.

Administrar el resultado de las tareas de Cron

Debido a que las tareas de Cron se ejecutan en segundo plano, no siempre es evidente que la ejecución se realice de forma correcta. Ahora que sabe usar el comando crontab y programar tareas de Cron, puede comenzar a experimentar con algunas maneras distintas de redireccionar el resultado de las tareas como ayuda para controlar que se ejecuten de forma correcta.

Si tiene un agente de transferencia de correo, como Sendmail, instalado y configurado correctamente en su servidor, puede enviar el resultado de las tareas de Cron a la dirección de correo electrónico asociada a su perfil de usuario de Linux. También puede especificar manualmente una dirección de correo electrónico proporcionando un ajuste MAILTO en la parte superior del crontab.

Por ejemplo, podría añadir las líneas siguientes a un crontab. Estas incluyen una instrucción MAILTO seguida de una dirección de correo electrónico de ejemplo, una directiva SHELL que indica la shell que se debe ejecutar (bash en este ejemplo), una directiva HOME que indica la ruta en la que se debe buscar el binario de Cron y una única tarea de cron:

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

Esta tarea en particular mostrará “Run this command every minute" (Ejecutar este comando a cada minuto) y el resultado se enviará por correo electrónico a cada minuto a la dirección especificada después de la directiva MAILTO.

También puede redireccionar el resultado de una tarea de Cron a un archivo de registro o a una ubicación vacía para evitar recibir un correo electrónico con el resultado.

Para anexar el resultado de un comando programado a un archivo de registro, añada >> al final del comando, seguido por el nombre y la ubicación de un archivo de registro que elija, de la siguiente manera:

* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

Supongamos que desea usar Cron para ejecutar una secuencia de comandos, pero quiere que se siga ejecutando segundo plano. Para hacerlo, podría redireccionar el resultado de la secuencia de comandos a una ubicación vacía, como /dev/null, que elimina de inmediato cualquier dato que se escriba en ella. Por ejemplo, la siguiente tarea de Cron ejecuta una secuencia de comandos PHP y lo hace en segundo plano:

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

Esta tarea de Cron también redirecciona un error estándar, representado por 2, al resultado estándar (>&1). Dado que el resultado estándar ya se redirecciona a /dev/null, esencialmente esto permite que la secuencia de comandos se ejecute de forma silenciosa. Incluso si el crontab contiene una instrucción MAILTO, el resultado del comando no se enviará a la dirección de correo electrónico especificada.

Restringir el acceso

Puede administrar el permiso de los usuarios para usar el comando crontab con los archivos cron.allow y cron.deny, que se almacenan en el directorio /etc/. Si hay un archivo cron.deny, ningún usuario incluido en él podrá editar su crontab. Si hay un archivo cron.allow, solo los usuarios incluidos en él podrán editar sus crontabs. Si los dos archivos están presentes y un mismo usuario está incluido en ambos, el archivo cron.allow anulará cron.deny y el usuario podrá editar su crontab.

Por ejemplo, para denegar el acceso a todos los usuarios y luego dar acceso al usuario ishmael, podría usar la siguiente secuencia de comandos:

  • sudo echo ALL >>/etc/cron.deny
  • sudo echo ishmael >>/etc/cron.allow

Primero, bloqueamos a todos los usuarios anexando ALL al archivo cron.deny. Luego, al anexar el nombre de usuario al archivo cron.allow, le damos acceso al perfil de usuario ishmael para ejecutar tareas de Cron.

Tenga en cuenta que si un usuario tiene privilegios sudo, puede editar el crontab de otro usuario con el siguiente comando:

  • sudo crontab -u user -e

Sin embargo, si cron.deny está presente y user está incluido en él, pero no en cron.allow, verá el siguiente error después de ejecutar el comando anterior:

Output
The user user cannot use this program (crontab)

Por defecto, la mayoría de los demonios de Cron preverán que todos los usuarios tienen acceso a Cron, a menos que cron.allow o cron.deny estén presentes.

Sintaxis especial

También hay varios comandos abreviados que puede usar en su archivo crontab para agilizar la programación de tareas. Básicamente, son atajos para la programación numérica equivalente especificada:

Comando Abrevia
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

Nota: No todos los demonios de Cron pueden analizar esta sintaxis (en particular, las versiones antiguas), por lo que debe comprobar que funcione para poder confiar en ella.

Además, el comando abreviado @reboot ejecuta cualquier comando que le siga cada vez que se inicie el servidor:

@reboot echo "System start up"

El uso de estos atajos, siempre que sea posible, puede facilitar la interpretación de la programación de tareas en su crontab.

Conclusión

Cron es una herramienta muy útil y flexible que puede reducir la carga de muchas tareas relacionadas con la administración del sistema. Cuando se combina con secuencias de comandos shell, puede automatizar tareas que habitualmente son tediosas o complicadas. Por ejemplo, podría escribir una secuencia de comandos shell para enviar copias de seguridad de datos a una solución de almacenamiento de objetos y, luego, automatizarlas con Cron.

0 Comments

Creative Commons License