Tutorial

Cómo usar Cron para automatizar tareas en CentOS 8

Published on March 12, 2020
Default avatar

By Mark Drake

Manager, Developer Education

Español
Cómo usar Cron para automatizar tareas en CentOS 8

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 CentOS 8. Puede ser 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 CentOS 8.

Instalar Cron

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

Antes de instalar cron en una máquina con CentOS, actualice el índice local de paquetes de esta:

  1. sudo dnf update

Luego, instale el demonio cron con el siguiente comando:

  1. sudo dnf install crontabs

Este comando le solicitará confirmar que quiere instalar el paquete crontabs y sus dependencias. Hágalo presionando y y luego ENTER.

Con esto se instalará cron en su sistema, pero necesitará iniciar el demonio de forma manual. También deberá asegurarse de que esté configurado para ejecutarse cuando el servidor se inicie. Puede realizar ambas acciones con el comando systemctl.

Para iniciar el demonio cron, ejecute el siguiente comando:

  1. sudo systemctl start crond.service

Para establecer que se ejecute cron cuando se inicie el servidor, escriba lo siguiente:

  1. sudo systemctl enable crond.service

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, que permite la programación de tareas y se almacena en /var/spool/cron/.

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:

  1. crontab -e

Con esto, se abrirá su crontab en el editor de texto predeterminado de su perfil de usuario.

Nota: En los nuevos servidores de CentOS 8, con el comando crontab -e se abrirá el contrab de su usuario con vi por defecto. vi es un editor de texto extremadamente poderoso y flexible, pero puede parecer algo lento para los usuarios que carecen de experiencia en él.

Si desea usar un editor de texto más accesible como su editor de crontab predeterminado, podría instalar y configurar nano como tal.

Para hacer esto, instale nano con dnf:

  1. sudo dnf install nano

Cuando se le solicite, presione y y luego ENTER para confirmar que quiere instalar nano.

Para establecer nano como el editor visual predeterminado de su perfil de usuario, abra el archivo .bash_profile para editarlo. Ahora que lo instaló, puede hacerlo con nano:

  1. nano ~/.bash_profile

Al final del archivo, añada la siguiente línea:

~/.bash_profile
. . .
export VISUAL="nano"

Con esto se fija la variable de entorno VISUAL en nano. VISUAL es una variable de entorno de Unix que en muchos programas, incluido crontab, se invoca para editar un archivo. Después de añadir esta línea, guarde y cierre el archivo presionando CTRL + X, Y y luego ENTER.

Luego vuelva a cargar .bash_profile para que en el shell se aplique el nuevo cambio:

  1. . ~/.bash_profile

Cuando se encuentre en el editor, podrá ingresar su programación con cada tarea en una nueva línea. De lo contrario, puede guardar y cerrar el crontab por ahora. Si abrió su crontab con vi, el editor de texto de CentOS 8 predeterminado, puede hacerlo presionando ESC para asegurarse de que esté en el modo de comandos de vi, luego escriba :x y presione INTRO.

Tenga en cuenta que, en los sistemas Linux, existe 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:

  1. sudo nano /etc/crontab

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

  1. 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.

  1. 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:

  1. crontab -r -i
Output
crontab: really delete sammy's crontab?

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:

  1. sudo echo ALL >>/etc/cron.deny
  2. 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:

  1. 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.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar

Manager, Developer Education

Technical Writer @ DigitalOcean

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel