Cómo utilizar Cron para automatizar tareas en Ubuntu 18.04

Introducción
Cron es un demonio de programación de tareas basado en el tiempo que se encuentra en sistemas operativos tipo Unix, incluidas las distribuciones Linux. Cron se ejecuta en segundo plano y las operaciones programadas con cron
, denominadas “trabajos cron”, se ejecutan automáticamente, lo que hace que cron sea útil para automatizar tareas relacionadas con el mantenimiento.
Esta guía ofrece una descripción general de cómo programar tareas utilizando la sintaxis especial de cron. También repasa algunos atajos que puede utilizar para acelerar el proceso de escritura de programaciones de tareas y hacerlas más comprensibles.
Prerrequisitos
Para completar esta guía, necesitarás acceso a una computadora con Ubuntu 18.04. Puede ser tu máquina local, una máquina virtual o un servidor privado virtual.
Independientemente del tipo de computadora que uses para seguir esta guía, debe tener configurado un usuario no root con privilegios administrativos. Para configurarlo, sigue nuestra guía de configuración inicial del servidor para Ubuntu 18.04 .
Instalación de Cron
Casi todas las distribuciones de Linux tienen algún tipo de cron
instalado de forma predeterminada. Sin embargo, si estás usando una máquina Ubuntu en la que cron
no está instalado, puedes instalarlo usando APT.
Antes de instalarlo cron
en una máquina Ubuntu, actualice el índice de paquetes local de la computadora:
- sudo apt update
Luego instala cron
con el siguiente comando:
- sudo apt install cron
Necesitarás asegurarte de que esté configurado para ejecutarse en segundo plano también:
- sudo systemctl enable cron
OutputSynchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable cron
Luego de eso, cron
se instalará en su sistema y estará listo para que pueda comenzar a programar trabajos.
Entendiendo cómo funciona Cron
Los trabajos de cron se registran y se administran en un archivo especial conocido como crontab
. Cada perfil de usuario del sistema puede tener su propio crontab
archivo donde programar trabajos, que se almacena en /var/spool/cron/crontabs/
.
Para programar un trabajo, abra su crontab
cuenta para editarla y agregue una tarea escrita en forma de expresión cron . La sintaxis de las expresiones cron se puede dividir en dos elementos: la programación y el comando para ejecutar.
El comando puede ser prácticamente cualquier comando que normalmente ejecutaría en la línea de comandos. El componente de programación de la sintaxis se divide en 5 campos diferentes, que se escriben en el siguiente orden:
Campo | Valores permitidos |
---|---|
minuto | 0-59 |
hora | 0-23 |
Día del mes | 1-31 |
mes | 1-12 oJAN-DEC |
Día de la semana | 0-6 oSUN-SAT |
En conjunto, las tareas programadas en un crontab se estructuran de la siguiente manera:
minute hour day_of_month month day_of_week command_to_run
A continuación se muestra un ejemplo funcional de una expresión cron. Esta expresión ejecuta el comando curl http://www.google.com
todos los martes a las 5:30 p. m.:
30 17 * * 2 curl http://www.google.com
También hay algunos caracteres especiales que puedes incluir en el componente de programación de una expresión cron para agilizar las tareas de programación:
*
:En las expresiones cron, un asterisco es una variable comodín que representa “todos”. Por lo tanto, una tarea programada con* * * * * ...
se ejecutará cada minuto de cada hora de cada día de cada mes.,
:Las comas dividen los valores de programación para formar una lista. Si desea que una tarea se ejecute al principio y a la mitad de cada hora, en lugar de escribir dos tareas separadas (por ejemplo,0 * * * * ...
y30 * * * * ...
), puede lograr la misma funcionalidad con una (0,30 * * * * ...
).-
: Un guion representa un rango de valores en el campo de programación. En lugar de tener 30 tareas programadas independientes para un comando que desea ejecutar durante los primeros 30 minutos de cada hora (como en0 * * * * ...
,1 * * * * ...
,2 * * * * ...
, etc.), puede programarlo como0-29 * * * * ...
./
:Puede utilizar una barra diagonal con un asterisco para expresar un valor de paso. Por ejemplo, en lugar de escribir ochocron
tareas independientes para ejecutar un comando cada tres horas (como en ,0 0 * * * ...
,0 3 * * * ...
,0 6 * * * ...
etc.), podría programarlo para que se ejecute de esta manera:0 */3 * * * ...
.
Nota : No se pueden expresar valores de paso de forma arbitraria; solo se pueden utilizar números enteros que se dividan exactamente en el rango permitido por el campo en cuestión. Por ejemplo, en el campo “horas”, solo se puede seguir una barra diagonal con 1
, 2
, 3
, 4
, 6
, 8
o 12
.
A continuación se muestran algunos ejemplos más de cómo utilizar el componente de programación de cron:
* * * * *
– Ejecuta el comando cada minuto.12 * * * *
– Ejecute el comando 12 minutos después de cada hora.0,15,30,45 * * * *
– Ejecute el comando cada 15 minutos.*/15 * * * *
– Ejecute el comando cada 15 minutos.0 4 * * *
– Ejecute el comando todos los días a las 4:00 AM.0 4 * * 2-4
– Ejecute el comando todos los martes, miércoles y jueves a las 4:00 a. m.20,40 */8 * 7-12 *
– Ejecutar el comando los minutos 20 y 40 de cada 8 horas todos los días de los últimos 6 meses del año.
Si algo de esto le resulta confuso o si desea ayuda para escribir cronogramas para sus propias cron
tareas, Cronitor proporciona un práctico cron
editor de expresiones de cronogramas llamado “Crontab Guru” que puede usar para verificar si sus cron
cronogramas son válidos.
Administrar crontabs
Una vez que hayas establecido un cronograma y sepas el trabajo que quieres ejecutar, deberás colocarlo en algún lugar donde tu demonio pueda leerlo.
Como se mencionó anteriormente, un crontab
es un archivo especial que contiene el cronograma de trabajos cron
que se ejecutarán. Sin embargo, no están destinados a editarse directamente. En cambio, se recomienda que use el crontab
comando . Esto le permite editar su perfil de usuario crontab
sin cambiar sus privilegios con sudo
. El crontab
comando también le permitirá saber si tiene errores de sintaxis en el crontab
, mientras que editarlo directamente no lo hará.
Puedes editarlo crontab
con el siguiente comando:
- crontab -e
Si es la primera vez que ejecuta el crontab
comando con este perfil de usuario, se le solicitará que seleccione un editor de texto predeterminado para usar al editar su crontab
:
Outputno crontab for sammy - using an empty oneSelect an editor. To change later, run 'select-editor'. 1. /bin/nano ---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/edChoose 1-4 [1]:
Introduzca el número correspondiente al editor de su elección. Alternativamente, puede presionar ENTER
para aceptar la opción predeterminada nano
.
Después de realizar su selección, se le dirigirá a un nuevo sitio crontab
que contiene algunas instrucciones comentadas 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 lo ejecute crontab -e
en el futuro, aparecerá crontab
automáticamente en este editor de texto. Una vez en el editor, puede ingresar su cronograma con cada trabajo en una nueva línea. De lo contrario, puede guardar y cerrar el crontab por ahora ( CTRL + X
, Y
, entonces ENTER
si seleccionó nano
).
Nota : En los sistemas Linux, hay otro crontab
almacenado en el /etc/
directorio. Se trata de un campo de todo el sistema crontab
que tiene un campo adicional para el perfil de usuario cron
bajo el cual se debe ejecutar cada trabajo. Este tutorial se centra en el campo específico del usuario crontabs
, pero si desea editar el campo de todo el sistema crontab
, puede hacerlo con el siguiente comando:
- sudo nano /etc/crontab
Si desea ver el contenido de su crontab
, pero no editarlo, puede utilizar el siguiente comando:
- crontab -l
Puedes borrar tu crontab
con el siguiente comando:
Advertencia : El siguiente comando no le pedirá que confirme que desea borrar su archivo crontab
. Ejecútelo únicamente si está seguro de que desea borrarlo .
- crontab -r
Este comando eliminará el usuario crontab
inmediatamente. Sin embargo, puede incluir la -i
bandera para que el comando le solicite que confirme que realmente desea eliminar el usuario crontab
:
- crontab -r -i
Outputcrontab: really delete sammy's crontab? (y/n)
Cuando se le solicite, deberá ingresar y
para eliminar crontab
o n
para cancelar la eliminación.
Gestión de la salida de trabajos cron
Dado que cron
los trabajos se ejecutan en segundo plano, no siempre resulta evidente que se hayan ejecutado correctamente. Ahora que sabe cómo utilizar el crontab
comando y cómo programar un cron
trabajo, puede comenzar a experimentar con diferentes formas de redirigir la salida de cron
los trabajos para ayudarle a realizar un seguimiento de su ejecución correcta.
Si tiene un agente de transferencia de correo , como Sendmail , instalado y configurado correctamente en su servidor, puede enviar el resultado de cron
las tareas a la dirección de correo electrónico asociada con su perfil de usuario de Linux. También puede especificar manualmente una dirección de correo electrónico proporcionando una MAILTO
configuración en la parte superior del archivo crontab
.
Por ejemplo, puede agregar las siguientes líneas a un archivo crontab
. Estas incluyen una MAILTO
declaración seguida de una dirección de correo electrónico de ejemplo, una SHELL
directiva que indica el shell que se debe ejecutar ( bash
en este ejemplo), una HOME
directiva que señala la ruta en la que se debe buscar el cron
binario y una sola cron
tarea:
. . .MAILTO="example@digitalocean.com"SHELL=/bin/bashHOME=/* * * * * echo ‘Run this command every minute’
Este trabajo en particular devolverá “Ejecutar este comando cada minuto”, y esa salida se enviará por correo electrónico cada minuto a la dirección de correo electrónico especificada después de la MAILTO
directiva.
También puede redirigir cron
la salida de una tarea a un archivo de registro o a una ubicación vacía para evitar recibir un correo electrónico con la salida.
Para agregar la salida de un comando programado a un archivo de registro, agregue al final del comando seguido del nombre y la ubicación de un archivo de registro de su elección, de esta manera:
* * * * * echo ‘Run this command every minute’ /directory/path/file.log
Digamos que desea cron
ejecutar un script pero mantenerlo en ejecución en segundo plano. Para ello, puede redirigir la salida del script a una ubicación vacía, como /dev/null
lo que elimina inmediatamente cualquier dato escrito en él. Por ejemplo, el siguiente cron
trabajo ejecuta un script PHP y lo ejecuta en segundo plano:
* * * * * /usr/bin/php /var/www/domain.com/backup.php /dev/null 21
Este cron
trabajo también redirige el error estándar (representado por 2
) a la salida estándar ( 1
). Debido a que la salida estándar ya se está redirigiendo a /dev/null
, esto básicamente permite que el script se ejecute de manera silenciosa. Incluso si crontab
contiene una MAILTO
declaración, la salida del comando no se enviará a la dirección de correo electrónico especificada.
Restringir el acceso
Puede administrar qué usuarios tienen permiso para usar el crontab
comando con los archivos cron.allow
y cron.deny
, que se almacenan en el /etc/
directorio. Si el cron.deny
archivo existe, cualquier usuario que figure en él no podrá editar su crontab
. Si cron.allow
existe, solo los usuarios que figuren en él podrán editar sus crontabs. Si ambos archivos existen y el mismo usuario figura en cada uno, el cron.allow
archivo se sobrescribirá 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 utilizar la siguiente secuencia de comandos:
- sudo echo ALL /etc/cron.deny
- sudo echo ishmael /etc/cron.allow
Primero, bloqueamos a todos los usuarios agregando datos ALL
al cron.deny
archivo. Luego, agregando el nombre de usuario al cron.allow
archivo, le damos al perfil de usuario ishmael acceso para ejecutar cron
trabajos.
Tenga en cuenta que si un usuario tiene sudo
privilegios, puede editar los de otro usuario crontab
con el siguiente comando:
- sudo crontab -u user -e
Sin embargo, si cron.deny
existe yusuarioestá incluido en él y no está incluido en cron.allow
, recibirá el siguiente error después de ejecutar el comando anterior:
OutputThe user user cannot use this program (crontab)
De forma predeterminada, la mayoría de cron
los daemons asumirán que todos los usuarios tienen acceso a cron
menos que cron.allow
o cron.deny
exista.
Sintaxis especial
También hay varios comandos abreviados que puede utilizar en su crontab
archivo para ayudar a agilizar la programación de trabajos. Básicamente, son atajos para la programación numérica equivalente especificada:
Atajo | Taquigrafía para |
---|---|
@hourly |
0 * * * * |
@daily |
0 0 * * * |
@weekly |
0 0 * * 0 |
@monthly |
0 0 1 * * |
@yearly |
0 0 1 1 * |
Nota : No todos cron
los demonios pueden analizar esta sintaxis (en particular las versiones más antiguas), así que verifique que funcione antes de confiar en ella.
Además, la @reboot
abreviatura ejecutará 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 ayudar a facilitar la interpretación del cronograma de tareas en su crontab
.
Conclusión
Cron es una utilidad flexible y potente que puede reducir la carga de muchas tareas asociadas con la administración del sistema. Cuando se combina con scripts de shell, puede automatizar tareas que normalmente son tediosas o complicadas. Por ejemplo, puede escribir un script de shell para enviar copias de seguridad de datos a una solución de almacenamiento de objetos y luego automatizarlo con cron .
Deja una respuesta