Cómo usar Cron para automatizar tareas en Ubuntu

Introducción

Cron es un demonio de programación de trabajos basado en el tiempo que se encuentra en sistemas operativos tipo Unix, incluidas las distribuciones de Linux. Cron se ejecuta en segundo plano y las tareas programadas con cron, denominadas “cron jobs (tareas)”, se ejecutan automáticamente. Esto hace que cron sea útil para automatizar tareas relacionadas con el mantenimiento.

Esta guía proporciona una descripción general de cómo programar tareas utilizando la sintaxis especial de cron. También repasa algunos atajos que puedes usar para hacer que la programación de tareas sean más fáciles de escribir y comprender.

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 utilices para seguir esta guía, debes tener un usuario no root con privilegios administrativos configurados. Para configurar esto, debes seguir nuestra guía de configuración básica de servidores para Ubuntu.

Instalar Cron

Casi todas las distribuciones de Linux tienen alguna forma de cron instalada por defecto. Sin embargo, si estás utilizando una máquina Ubuntu en la que no está instalado cron, puedes instalarlo usando APT.

Antes de instalar cron en una máquina Ubuntu, debes actualizar el índice del paquete local de la computadora:

Luego debes instalar cron con el siguiente comando:

Deberás asegurarte de que esté configurado para ejecutarse también en segundo plano:

Después de eso, cron se instalará en tu sistema y estará listo para que comiences a programar tareas.

Comprendiendo cómo funciona Cron

Las tareas de Cron se registran y gestionan en un archivo especial conocido como a crontab. Cada perfil de usuario en el sistema puede tener su propio crontab donde pueden programar tareas, que se almacenan en /var/spool/cron/crontabs/.

Para programar una tarea, solo necesitas abrir tu crontab para editarlo y agregar una tarea escrita en forma de una expresión cron. La sintaxis para 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 ejecutes 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 or JAN-DEC
Día de la semana 0-6 or SUN-SAT

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

Aquí hay 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.:

Caracteres especiales

También hay algunos caracteres especiales que puedes incluir en el componente de programación de una expresión cron para facilitar la 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 deseas ejecutar una tarea al comienzo y a la mitad de cada hora, en lugar de escribir dos tareas separadas. Por ejemplo, 0 * * * * … y 30 * * * * …, puedes lograr la misma funcionalidad con una 0,30 * * * * …
  • : Un guion representa un rango de valores en el campo de programación. No es necesario tener 30 tareas programadas separadas para un comando que deseas ejecutar durante los primeros 30 minutos de cada hora. Por ejemplo, 0 * * * * …1 * * * * …2 * * * * …, y así sucesivamente, sólo podrías programar 0-29 * * * * …
  • /: Puedes usar una barra diagonal con un asterisco para expresar un valor de paso. Por ejemplo, en lugar de escribir ocho tareas cron independientes separadas para ejecutar un comando cada tres horas. En lugar de usar, 0 0 * * * …0 3 * * * …0 6 * * * …, etc., se puede programar para que se ejecute de la siguiente manera: 0 */3 * * * ….

Nota

No puedes expresar valores de paso arbitrariamente; solo puedes usar números enteros que se dividen equitativamente en el rango permitido por el campo en cuestión. Por ejemplo, en el campo “hora” sólo se podía seguir adelante con una barra 123468, o 12.

Aquí hay algunos ejemplos más de cómo usar el componente de programación de cron:

  • * * * * * – Ejecutar el comando cada minuto.
  • 12 * * * * – Ejecutar el comando 12 minutos después de cada hora.
  • 0,15,30,45 * * * * – Ejecutar el comando cada 15 minutos.
  • */15 * * * * – Ejecutar el comando cada 15 minutos.
  • 0 4 * * * – Ejecutar el comando todos los días a las 4:00 a.m.
  • 0 4 * * 2-4 – Ejecutar 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 encuentras algo de esto confuso o si deseas ayuda para escribir horarios para tus propias tareas cron puedes usar Cronitor. Este  proporciona un práctico editor de expresiones de cron llamado “Crontab Guru” que puedes usar para verificar si tus programaciones cron son válidas.

Administrar Crontabs

Una vez que hayas establecido una programación y conozcas la tarea que deseas 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 la programación de tareas que cron ejecutará. Sin embargo, estos no están destinados a ser editados directamente.

En cambio, te recomendamos que uses el comando crontab. Esto te permite editar el crontab de tu perfil de usuario sin cambiar tus privilegios con sudo. El comando crontab también te informará si tienes errores de sintaxis en el crontab, mientras que editarlo directamente no lo hará.

Puedes editar tu crontab con el siguiente comando:

Si es la primera vez que ejecutas el comando crontab en este perfil de usuario, te pedirá que selecciones un editor de texto predeterminado para usar cuando edites tu crontab:

Debes ingresar el número correspondiente al editor de tu elección. Como alternativa, puedes simplemente pulsar ENTER para aceptar la opción por defecto, nano.

Después de hacer tu selección, serás llevado a un nuevo crontab que contiene algunas instrucciones comentadas sobre cómo usarlo:

Cuando ejecutes crontab –e en el futuro, aparecerá tu crontab en este editor de texto automáticamente. Una vez en el editor, puedes ingresar tu programación con cada tarea en una nueva línea. De lo contrario, puedes guardar y cerrar el crontab por ahora (CTRL + XY y luego ENTER si has seleccionado nano).

Nota:

En los sistemas Linux, hay otro crontab almacenado en el directorio /etc/. Este es un crontab de todo el sistema que tiene 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 del usuario, pero si deseas editar el crontab de todo el sistema, puedes hacerlo con el siguiente comando:

Si deseas ver el contenido de tu crontab, pero no editarlo, puedes usar el siguiente comando:

Puedes borrar tu crontab con el siguiente comando:

Advertencia: El siguiente comando no te pedirá que confirmes que deseas borrar tu crontab. Solo ejecútalo si estás seguro de que deseas borrarlo.

Este comando eliminará el crontab del usuario de inmediato. Sin embargo, puedes incluir el indicador –i para que el comando te solicite que confirmes que realmente deseas eliminar el crontab del usuario:

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

Gestionar la salida de tareas de Cron

Debido a que las tareas cron se ejecutan en segundo plano, no siempre es evidente que se hayan ejecutado correctamente. Ahora que sabes cómo usar el comando crontab y cómo programar una tarea cron, puedes comenzar a experimentar con diferentes formas de redirigir la salida de las tareas cron. Esto para ayudarte a rastrear que se han ejecutado con éxito.

Si tienes un agente de transferencia de correo, como Sendmail, instalado y configurado correctamente en tu servidor, puede enviar la salida de las tareas cron. La información se enviará a la dirección de correo electrónico asociada con tu perfil de usuario de Linux.

También puedes especificar manualmente una dirección de correo electrónico proporcionando una configuración MAILTO en la parte superior del crontab.

MAILTO

Por ejemplo, podrías agregar las siguientes líneas a un crontab. Estos incluyen una declaración MAILTO seguida de una dirección de correo electrónico de ejemplo. Además, una directiva SHELL que indica la shell a ejecutar (bash en este ejemplo). También una directiva HOME que señala la ruta en la que buscar el binario cron y una única tarea cron:

Esta tarea en particular devolverá “Ejecutar este comando cada minuto”.  Dicha salida se enviará por correo electrónico cada minuto a la dirección de correo electrónico especificada después de la directiva MAILTO.

También puedes redirigir la salida de una tarea cron 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, agrega >> al final del comando seguido del nombre. Además, debes incluir la ubicación del archivo de registro que elijas, de esta manera:

Digamos que deseas usar cron para ejecutar un script, pero mantenerlo ejecutándose en segundo plano. Para hacerlo, puedes redirigir la salida del script a una ubicación vacía, como /dev/null que elimina de inmediato cualquier dato escrito en ella. Por ejemplo, la siguiente tarea cron ejecuta un script PHP y lo ejecuta en segundo plano:

La tarea cron 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 esencialmente permite que el script se ejecute en silencio. Incluso si el crontab contiene una declaración MAILTO, la salida del comando no se enviará a la dirección de correo electrónico especificada.

Restricción de acceso

Puedes administrar qué usuarios pueden usar el comando crontab con los archivos cron.allowcron.deny. Estos están almacenados en el directorio /etc/.

Si el archivo cron.deny existe, se prohibirá a cualquier usuario enumerado en él editar tu crontab. Si cron.allow existe, solo los usuarios listados en él podrán editar tus crontabs. Si ambos archivos existen y el mismo usuario aparece en cada uno, el archivo cron.allow anulará a cron.deny y el usuario podrá editar tu crontab.

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

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

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

Sin embargo, si cron.deny existe y el usuario aparece en este y no figura en el archivo cron.allow, recibirá el siguiente error después de ejecutar el comando anterior:

Por defecto, la mayoría de los demonios cron supondrán que todos los usuarios tienen acceso a cron a menos que existan cron.allowcron.deny.

Sintaxis Especial

También hay varios comandos abreviados que puedes usar en tu archivo crontab para ayudar a agilizar la programación de tareas. Son esencialmente atajos para la programación numérica equivalente especificada:

Atajo Taquigrafía
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

 

Nota: No todos los demonios cron pueden analizar esta sintaxis, particularmente las versiones antiguas. Por lo tanto, debes verificar que funcionen antes de confiar en ella.

Además, la taquigrafía @reboot ejecutará cualquier comando que le siga cada vez que se inicie el servidor:

El uso de estos atajos siempre que sea posible puede ayudar a que sea más fácil interpretar la programación de tareas en tu crontab.

Conclusión

Cron es una utilidad flexible y poderosa 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, podrías escribir un script de shell para enviar copias de seguridad de datos y luego automatizarlo con cron.