Cron es una utilidad UNIX simple que administra y programa la ejecución de comandos en su computadora. Fue desarrollado por primera vez en 1987 por Paul Vixie y desde entonces se ha convertido en una herramienta invaluable en los sistemas operativos basados en Linux tanto para administradores como para usuarios.
Hoy en día, hay una serie de implementaciones y reescrituras de cron que puede instalar fácilmente en su sistema Linux. A pesar de las diferencias, todos estos programas comparten el mismo linaje de Vixie Cron.
Como tal, este artículo tiene como objetivo proporcionar una descripción general básica de cómo funciona el cron original de Vixie, su sintaxis y cómo puede usarlo para programar tareas en su sistema Linux.
¿Cómo funciona Cron?
Cron es una utilidad UNIX increíblemente simple. Funciona en dos partes. Cron primero se ejecuta como un proceso en segundo plano que comienza cuando inicia su 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, consta de un código de tiempo y una ruta de archivo para cada script o programa que desee ejecutar.
Este enfoque permite que cron sea muy flexible en sistemas grandes. Por ejemplo, las implementaciones modernas de cron, como Cronie, solo ejecutan una única instancia de cron, incluso si esa máquina alberga varios usuarios.
Cronie lo hace posible proporcionando crontabs locales para cada usuario instalado en el sistema. Como tal, cron solo necesita saber quién es el propietario de crontab, el nivel de permiso de ese usuario y los comandos dentro de 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 la memoria.
Crontab: El corazón de Cron
Cada implementación de cron usa 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 ver ejecutando el siguiente comando:
crontab -l
Esto imprimirá el contenido del crontab del usuario actual en la salida estándar. Esto puede ser increíblemente útil si solo desea ver rápidamente qué comandos está ejecutando cron para ese usuario.
Para editarlo, deberá ejecutar el comando:
crontab -e
Esto le indicará a cron que ejecute su editor de texto predeterminado y cargue el archivo crontab dentro de él. Hacer eso le permitirá editar el archivo crontab.
La sintaxis crontab
La sintaxis del archivo crontab es increíblemente simple. Una sola línea en este archivo indicará un comando correspondiente que debe ejecutarse para ese usuario en particular. La forma general de un comando crontab se parece a esto:
m h d mon dow [flags] command
El intervalo de tiempo es un campo de cinco dígitos donde puede decirle a cron con qué frecuencia desea ejecutar un comando. Esta es la característica central de cualquier implementación de cron y le permite ser específico y flexible con la forma en que 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.
Él flags
El campo es un conjunto de opciones que modifican el comportamiento de cron para un solo comando. Por ejemplo, puede incluir el -n
opción para evitar que cron envíe correo del sistema.
Él command
El campo es el comando cron se ejecutará a intervalos establecidos. Puede ser un script de shell que haya escrito o una ruta de programa con banderas.
Sabiendo eso, puede usar todos estos juntos en una sola línea crontab para crear intervalos de tiempo específicos para sus 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 crontab:
30 2 24 7 * /home/$USER/myscript.sh
Nota: Se recomienda ejecutar un cronjob en un número de minutos «poco común» (11, 27 34, etc.) para evitar que diferentes trabajos cron se superpongan entre sí.
Códigos cortos
Crontab le permite usar algunos códigos cortos para que sus entradas cron sean más fáciles de leer.
@reboot
– Ejecutar una vez, al inicio@yearly
– Ejecutar una vez al año, “0 0 1 1 *”.>@annually
– igual que @anual@monthly
– Ejecutar una vez al mes, “0 0 1 * *”@weekly
– Ejecutar una vez por 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
Él @reboot
shortcode le permite crear scripts para ejecutar al inicio:
@reboot /home/ramces/.scripts/bootup.sh
Esto puede ser increíblemente útil si desea crear una forma de garantizar que los comandos se ejecuten tan pronto como encienda la máquina.
Nota: Dependiendo de la configuración de su sistema, el @reboot
shortcode puede o no funcionar según lo previsto en su sistema.
Crontabs del sistema
Otra característica brillante de cron es que puede administrar tareas recurrentes en todo el sistema, ya que también puede crear archivos crontab raíz. Esto puede ser increíblemente útil si desea automatizar el mantenimiento y las actualizaciones del sistema.
Para crear un crontab raíz, solo tienes que usar sudo
con el comando, o inicie sesión en su cuenta raíz:
sudo crontab -e
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 raíz le permite ejecutar comandos como cualquier usuario en el sistema:
m h d mon dow user [flags] "command"
Sabiendo eso, puede usar esto para crear comandos recurrentes tanto de usuario como de nivel raíz dentro del mismo crontab:
30 2 * * sun root /bin/apt update 30 5 * * * ramces /home/ramces/.scripts/file-backup.sh
Hacerlo de esta manera me permite conservar los permisos de mis archivos y al mismo tiempo tener un solo lugar donde puedo editar los comandos que quiero ejecutar.
Edición de entradas cron como otro usuario
Si en lugar de editar el crontab como usuario root, desea programar el trabajo cron como otro usuario, también es posible con el -u
bandera.
sudo crontab -u username -e
Por ejemplo, para ejecutar un trabajo cron como el usuario «www-data», use el siguiente comando:
sudo crontab -u www-data -e
Revisando la actividad de cron
Aunque ahora está configurado para ejecutar comandos o secuencias de comandos específicos, es posible que desee asegurarse de que se ejecute. Está integrado en cron que una vez que se ejecuta un comando, enviará un correo electrónico al propietario del cron. Esto se puede cambiar con la variable «MAILTO».
agregando MAILTO=youremail@yourdomain.com
enviará todos los informes de trabajos cron a un correo electrónico específico. Esta variable normalmente se puede encontrar en la parte superior de la pantalla de edición crontab. Sin embargo, si no está allí, puede agregar la variable y funcionará como se esperaba.
Varias direcciones de correo electrónico se pueden separar con una coma. Si necesita un comando diferente enviado por correo electrónico a otro lugar, puede agregar el comando MAILTO directamente encima del comando. Los comandos posteriores a ese mailto se enviarán por correo electrónico a la nueva dirección. Si te vas MAILTO=
en blanco, las notificaciones se enviarán al propietario de la entrada cron.
Si no desea recibir ningún correo electrónico, también puede consultar los registros cron. En la mayoría de los sistemas, el acceso a los registros cron requerirá permisos de superusuario. El registro cron se puede encontrar en «/var/log». El archivo cron o syslog mostrará el registro de las entradas cron ejecutadas.
sudo grep crontab syslog
Preguntas frecuentes
¿Por qué mi comando cron se ejecuta cada minuto en lugar de una vez por hora?
Este es uno de los errores más comunes al administrar crontabs. De forma predeterminada, agregar un valor de asterisco en un código de tiempo significa que se ejecutará para cada instancia posible para ese valor. Por ejemplo, un valor de 0 12 * * *
le dirá a cron que desea ejecutar un comando una vez al día a las 12:00 p.m.
Sin embargo, la mayoría de los principiantes suelen escribir el mismo código de tiempo que * 12 * * *
. Escribirlo de esta manera significará que el comando se ejecutará una vez por minuto desde las 12:00 p. m. hasta las 12:59 p. m. Como tal, es una buena práctica escribir 0 en el campo de los minutos para asegurarse de que el comando solo se ejecute una vez.
¿Hay alguna otra opción que pueda usar con cron?
Aparte de -n
y MAILTO
variables, también puede utilizar el -s
comando para decirle al programa que sea estricto con los comandos en ejecución. El uso de esta opción obligará a cron a centrarse solo en el comando actual hasta que finalice. Esto puede ser increíblemente útil si su máquina usa un conjunto de comandos que deben ejecutarse en un orden específico.
También puede utilizar el SHELL
variable para hacer que cron use un shell diferente para sus comandos. Por ejemplo: SHELL=/bin/ksh
Credito de imagen: Unsplash
Danos tu opinión