La Guía para Principiantes sobre el Uso de Cron en Linux

Imagen Destacada de la Guía de Cron

Cron es una simple utilidad de UNIX que gestiona y programa la ejecución de comandos en tu computadora. Fue desarrollado por primera vez en 1987 por Paul Vixie y desde entonces se ha convertido en una herramienta invaluable en sistemas operativos basados en Linux tanto para administradores como para usuarios.

Hoy en día, hay varias implementaciones y reescrituras de cron que puedes instalar fácilmente en tu sistema Linux. A pesar de las diferencias, estos programas comparten la misma herencia de Vixie Cron.

Así, este artículo tiene como objetivo proporcionar una descripción básica de cómo funciona el cron original de Vixie, su sintaxis y cómo puedes usarlo para programar tareas en tu sistema Linux.

Tabla de Contenidos

  • ¿Cómo Funciona Cron?
  • Crontab: El Corazón de Cron
  • Crontabs del Sistema
  • Revisando la actividad cron
  • Preguntas Frecuentes

También lee: Cómo Crear Tareas Cron en Linux con Zeit

¿Cómo Funciona Cron?

Cron es una utilidad de UNIX increíblemente simple. Funciona en dos partes. Cron primero se ejecuta como un proceso en segundo plano que comienza cuando enciendes tu sistema por primera vez.

A partir de ahí, lee un archivo específico cada minuto. Este archivo contiene una lista de comandos que, a su vez, consiste en un código de tiempo y una ruta de archivo para cada script o programa que deseas ejecutar.

Ejemplo de Crontab

Este enfoque permite que cron sea altamente flexible en grandes sistemas. Por ejemplo, implementaciones modernas de cron como Cronie solo ejecutan una única instancia de cron, incluso si esa máquina alberga múltiples usuarios.

Crontab Local

Cronie lo hace posible al proporcionar crontabs locales para cada usuario instalados en el sistema. Así, cron solo necesita saber quién es el propietario del crontab, el nivel de permiso de ese usuario y los comandos dentro del crontab.

Esto no solo hace que el sistema sea más eficiente, sino también más seguro al reducir la cantidad de programas privilegiados que se ejecutan en memoria.

Crontab: El Corazón de Cron

Cada implementación de cron utiliza alguna forma de crontab. Este es un archivo de texto simple que contiene todos los comandos que cron ejecutará para ese usuario en particular. Como se describió anteriormente, cada usuario en el sistema tiene su propio crontab. Pueden verlo ejecutando el siguiente comando:

crontab -l

Lista de Crontab

Esto imprimirá el contenido del crontab del usuario actual en la salida estándar. Esto puede ser increíblemente útil si solo deseas ver rápidamente qué comandos está ejecutando cron para ese usuario.

Para editarlo, necesitarás ejecutar el comando:

crontab -e

Esto le indicará a cron que ejecute tu editor de texto predeterminado y cargue el archivo crontab dentro de él. Hacer eso te permitirá editar el archivo crontab.

Editor de Crontab

También lee: Cómo Usar Temporizadores de Systemd como Reemplazo de Cron

La Sintaxis de Crontab

La sintaxis del archivo crontab es increíblemente simple. Una sola línea en este archivo indicará un comando correspondiente que necesita ejecutarse para ese usuario en particular. La forma general de un comando crontab se ve algo así:

m h d mon dow [flags]command

El intervalo de tiempo es un campo de cinco dígitos donde puedes decirle a cron con qué frecuencia deseas ejecutar un comando. Esta es la característica principal de cualquier implementación de cron y te permite ser tanto específico como flexible con cómo cron trata las tareas recurrentes.

  • m = minuto entre 0 y 59
  • h = hora entre 0 y 23
  • d = día del mes entre 1 y 31
  • mon = mes entre 1 y 12
  • dow = día de la semana entre 0 y 6. Cero es domingo.

El campo flags es un conjunto de opciones que modifican cómo se comporta cron para un solo comando. Por ejemplo, puedes incluir la opción -n para impedir que cron envíe correos del sistema.

El campo command es el comando que cron ejecutará a intervalos establecidos. Esto puede ser un script de shell que escribiste o una ruta de programa con flags.

Línea de Crontab

Sabiendo esto, puedes usar todos estos elementos juntos en una única línea de crontab para crear intervalos de tiempo específicos para tus tareas. Por ejemplo, puedo ejecutar un script en mi sistema Ubuntu cada 24 de julio a las 2:30 AM escribiendo la siguiente línea de crontab:

302247*/home/$USER/myscript.sh

Crontab Altamente Específico

Nota: Se recomienda ejecutar un trabajo cron en un número “poco común” de minutos (11, 27, 34, etc.) para evitar que diferentes trabajos cron se superpongan entre sí.

Códigos Cortos

Crontab te permite usar algunos códigos cortos para facilitar la lectura de tus entradas cron.

  • @reboot – Ejecutar una vez, al inicio
  • @yearly – Ejecutar una vez al año, “0 0 1 1 *”.
  • @annually – igual que @yearly
  • @monthly – Ejecutar una vez al mes, “0 0 1
  • @weekly – Ejecutar una vez a la semana, “0 0 0”
  • @daily – Ejecutar una vez al día, “0 0 *”
  • @midnight – igual que @daily
  • @hourly – Ejecutar una vez por hora, “0

Por ejemplo:

@daily ramces /home/ramces/.scripts/file-backup.sh

El código corto @reboot te permite crear scripts que se ejecuten al inicio:

@reboot /home/ramces/.scripts/bootup.sh

Esto puede ser increíblemente útil si quieres crear una forma de asegurarte de que los comandos se ejecuten tan pronto como enciendas la máquina.

Nota: Dependiendo de la configuración de tu sistema, el código corto @reboot puede o no funcionar como se espera en tu sistema.

Crontabs del Sistema

Otra característica brillante de cron es que puede gestionar tareas recurrentes a nivel de sistema, ya que también puedes crear archivos crontab root. Esto puede ser increíblemente útil si deseas automatizar el mantenimiento del sistema y las actualizaciones.

Para crear un crontab root, solo tienes que usar sudo con el comando, o iniciar sesión en tu cuenta root:

sudo crontab -e

Editor de Crontab Root

El crontab del sistema sigue en gran medida el mismo formato que el crontab del usuario. Sin embargo, una diferencia clave entre los dos es que el crontab root te permite ejecutar comandos como cualquier usuario en el sistema:

m h d mon dow user [flags]"command"

Sabiendo esto, puedes usarlo para crear comandos recurrentes tanto a nivel de usuario como de root dentro del mismo crontab:

302 sun root /bin/apt update  
305* ramces /home/ramces/.scripts/file-backup.sh

Hacerlo de esta manera me permite preservar los permisos de mis archivos mientras tengo un único lugar donde puedo editar los comandos que quiero ejecutar.

Formato Específico de Crontab

También lee: Por Qué y Cómo Editar Tu Archivo Sudoers en Linux

Editando entradas cron como otro usuario

Si en lugar de editar el crontab como usuario root, deseas programar un trabajo cron como otro usuario, también es posible con el flag -u.

sudo crontab -u nombredeusuario -e

Por ejemplo, para ejecutar un trabajo cron como el usuario “www-data”, usa el siguiente comando:

sudo crontab -u www-data -e

También lee: Cómo Guardar la Salida del Terminal en un Archivo en Linux

Revisando la actividad cron

Aunque ahora estás listo para ejecutar comandos o scripts específicos, es posible que desees asegurarte de que se ejecutaron. Integrado en cron está el hecho de que una vez que se ejecuta un comando, se enviará un correo electrónico al propietario de cron. Esto puede modificarse con la variable “MAILTO”.

variable-mailto-cron

Agregar [email protected] enviará todos los informes de trabajos cron a un correo electrónico especificado. Esta variable se puede encontrar típicamente en la parte superior de la pantalla de edición de crontab. Sin embargo, si no está allí, puedes agregar la variable y funcionará como se espera.

Múltiples direcciones de correo electrónico pueden separarse con una coma. Si necesitas que un comando diferente se envíe por correo a otro lugar, puedes añadir el comando MAILTO directamente sobre el comando. Los comandos después de ese mailto se enviarán al nueva dirección. Si dejas MAILTO= en blanco, las notificaciones se enviarán al propietario de la entrada cron.

Si no deseas recibir ningún correo electrónico, también puedes verificar los registros de cron. En la mayoría de los sistemas, acceder a los registros de cron requerirá permisos de superusuario. El registro de cron se puede encontrar en “/var/log”. El archivo cron o syslog mostrará el registro de las entradas cron ejecutadas.

sudogrep crontab syslog

Preguntas Frecuentes

¿Por qué mi comando cron se ejecuta cada minuto en lugar de una vez por hora?

Esta es una de las trampas más comunes al gestionar crontabs. Por defecto, agregar un valor de asterisco en un código de tiempo significa que se ejecutará para cada instancia posible de ese valor. Por ejemplo, un valor de 0 12 * * * le dirá a cron que deseas ejecutar un comando una vez al día a las 12:00 PM.

Sin embargo, la mayoría de los principiantes a menudo escriben el mismo código de tiempo como * 12 * * *. Escribirlo de esta manera significará que el comando se ejecutará una vez por minuto desde las 12:00 PM hasta las 12:59 PM. Por lo tanto, es buena práctica escribir 0 en el campo de minutos para asegurarse de que el comando solo se ejecute una vez.

¿Hay alguna otra opción que pueda usar con cron?

Además de las variables -n y MAILTO, también puedes usar el comando -s para decirle al programa que sea estricto con la ejecución de comandos. Usar esta opción forzará a cron a centrarse solo en el comando actual hasta que termine. Esto puede ser increíblemente útil si tu máquina utiliza un conjunto de comandos que deben ejecutarse en un orden específico.

También puedes usar la variable SHELL para que cron use un shell diferente para sus comandos. Por ejemplo: SHELL=/bin/ksh

Créditos de imagen: Unsplash