Shaun Lewis escribió una versión anterior de este tutorial.
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.
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.
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:
- sudo dnf update
Luego, instale el demonio cron con el siguiente comando:
- 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:
- sudo systemctl start crond.service
Para establecer que se ejecute cron cuando se inicie el servidor, escriba lo siguiente:
- sudo systemctl enable crond.service
Una vez hecho eso, Cron quedará instalado en su sistema y listo para comenzar a programar tareas.
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.
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
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
:
- 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
:
- nano ~/.bash_profile
Al final del archivo, añada la siguiente línea:
. . .
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:
- . ~/.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:
- 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
Outputcrontab: really delete sammy's crontab?
Cuando se solicite, deberá ingresar y
para eliminar el crontab o n
para cancelar la eliminación.
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.
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:
OutputThe 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.
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.
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.
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!