Cron es un daemon 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 “trabajos cron” (o cron jobs en ingles), se ejecutan automáticamente con una frecuenca configurabe, lo que 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 uno puede usar para hacer que los horarios de los jobs sean más fáciles de escribir y comprender.
Para completar esta guía, necesitará acceso a una computadora con alguna distribución de linux basada en debian (o debian). Puede ser su máquina local, una máquina virtual o un servidor privado virtual.
Independientemente del tipo de computadora que use para seguir esta guía, debe tener un usuario no root con privilegios administrativos configurados.
Instalando Cron
Para instalar cron basta con seguir la siguiente secuencia de comandos:
$> sudo apt update
$> sudo apt install cron
$> sudo systemctl enable cron
Como funciona cron
Los cron jobs se registran y administran en un archivo especial conocido como crontab. Cada perfil de usuario en el sistema puede tener su propio crontab donde pueden programar trabajos, dicho archivo se encuentra por lo general en /var/spool/cron/crontabs/.
Para programar un trabajo, solo necesita abrir su 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 ejecute en la línea de comando. El componente de programación de la sintaxis se divide en 5 campos diferentes, que se escriben en el siguiente orden:
Campo | Valores Permitidos |
minutos | 0-59 |
horas | 0-23 |
dia del mes | 1-31 |
mes | 1-12 ó JAN-DEC |
dia de la semana | 0-6 ó MON-SAT |
Juntas, las tareas programadas en un crontab se estructuran de la siguiente manera:
<minuto> <hora> <dia_del_mes> <mes> <dia_de_la_semana> <comando>
Aquí hay un ejemplo funcional de una expresión cron. Esta expresión ejecuta el comando /usr/bin/pytnon /etc/mi_programa/programa.py todos los martes a las 5:30 p.m.:
30 17 * * 2 /usr/bin/python /etc/mi_programa/programa.py
También hay algunos caracteres especiales que puede incluir en el componente de programación de una expresión cron para facilitar la programación:
- *: En expresiones cron, un asterisco es una variable comodín (wildcard) 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 se ejecute una tarea al comienzo y a la mitad de cada hora, en lugar de escribir dos tareas separadas (por ejemplo, 0 * * * * … y 30 * * * * …), puede lograr la misma funcionalidad con uno (0,30 * * * * …).
- –: Un guión representa un rango de valores en el campo de programación. En lugar de tener 30 tareas programadas separadas para un comando que desea ejecutar durante los primeros 30 minutos de cada hora (como en 0 * * * * …, 1 * * * * …, 2 * * * * .. ., etc.), puede programarlo como 0-29 * * * *…
- /: Puede usar una barra diagonal con un asterisco para expresar un valor de paso. Por ejemplo, en lugar de escribir ocho tareas cron separadas para ejecutar un comando cada tres horas (como en, 0 0 * * * …, 0 3 * * * …, 0 6 * * * …, y así sucesivamente), podría programarlo para que se ejecute de esta manera: 0 * / 3 * * * …
Aquí hay algunos ejemplos más de cómo usar el componente de programación de cron:
- * * * * – Ejecuta el comando cada minuto.
- 12 * * * * – Ejecuta el comando 12 minutos después de cada hora.
- 0,15,30,45 * * * * – Ejecuta el comando cada 15 minutos.
- / 15 * * * * – Otra forma de ejecutar 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:00 a.m.
- 20,40 * / 8 * 7-12 * – Ejecute el comando el 20 y 40 minutos de cada 8 horas todos los días de los últimos 6 meses del año.
Gestionando los crontabs
Una vez que haya establecido un cronograma y conozca el trabajo que desea ejecutar, deberá colocarlo en algún lugar donde su daemon pueda leerlo.
Como se mencionó anteriormente, un crontab es un archivo especial que contiene la programación de trabajos que cron ejecutará. Sin embargo, estos no están destinados a ser editados directamente. En cambio, se recomienda que use el comando crontab. Esto le permite editar el crontab de su perfil de usuario sin cambiar sus privilegios con sudo. El comando crontab también le informará si tiene errores de sintaxis en el crontab, mientras que editarlo directamente no lo hará.
Puede editar su crontab con el siguiente comando:
$> crontab -e
Si es la primera vez que ejecuta el comando crontab en este perfil de usuario, le pedirá que seleccione un editor de texto predeterminado para usar cuando edite su crontab:
no crontab for ricardogeek - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
Ingrese el número correspondiente al editor de su elección. Alternativamente, puede presionar ENTER para aceptar la opción predeterminada, nano.
Después de hacer su selección, se lo dirigirá a un nuevo crontab que contiene algunas instrucciones comentadas sobre cómo usarlo:
Cuando ejecute crontab -e en el futuro, mostrará su crontab en este editor de texto automáticamente. Una vez en el editor, puede ingresar su programación con cada trabajo en una nueva línea. De lo contrario, puede guardar y cerrar el crontab por ahora (CTRL + X, Y, luego ENTER si seleccionó nano).
Si desea ver el contenido de su crontab, pero no editarlo, puede usar el siguiente comando:
crontab -l
Puede borrar su crontab con el siguiente comando:
crontab -r
Este comando eliminará el crontab del usuario de inmediato. Sin embargo, puede incluir el indicador -i para que el símbolo del sistema le confirme que realmente desea eliminar el crontab del usuario:
Capturar la salida del cron job
Debido a que los trabajos cron se ejecutan en segundo plano, no siempre es evidente que se hayan ejecutado correctamente. Ahora que sabe cómo usar el comando crontab y cómo programar un trabajo cron, puede comenzar a experimentar con diferentes formas de redirigir la salida de los trabajos cron para ayudarlo a rastrear que se han ejecutado con éxito.
Si tiene un agente de transferencia de correo, como Sendmail, instalado y configurado correctamente en su servidor, puede enviar la salida de tareas cron 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 configuración MAILTO en la parte superior del crontab.
Por ejemplo, podría agregar las siguientes líneas a un crontab. Estos incluyen una instrucción MAILTO seguida de una dirección de correo electrónico de ejemplo, una directiva SHELL que indica el shell a ejecutar (bash en este ejemplo), una directiva HOME que señala la ruta en la que buscar el binario cron y una única tarea cron:
. . .
MAILTO="[email protected]"
SHELL=/bin/bash
HOME=/
* * * * * echo 'El barco del fracaso flota en un mar de excusas'
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 directiva MAILTO.
También puede 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, agregue >> al final del comando seguido del nombre y la ubicación del archivo de registro que elija, de esta manera:
* * * * * echo 'La disciplina es el puente entre metas y logros' >> /etc/cron_logs/cron.log
Supongamos que desea usar cron para ejecutar un script pero mantenerlo ejecutándose en segundo plano. Para hacerlo, puede redirigir la salida del script a una ubicación vacía, como /dev/null, que elimina de inmediato cualquier dato escrito en él. Por ejemplo, el siguiente trabajo cron ejecuta un script PHP y lo ejecuta en segundo plano:
* * * * * /usr/bin/php /var/www/ricardogeek.com/backup.php > /dev/null 2>&1
Este trabajo 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 instrucción MAILTO, la salida del comando no se enviará a la dirección de correo electrónico especificada.
Seguridad
Puede administrar qué usuarios pueden usar el comando crontab con los archivos cron.allow y cron.deny, los cuales están almacenados en el directorio /etc/. Si el archivo cron.deny existe, se prohibirá a cualquier usuario que aparezca en él editar su crontab. Si existe cron.allow, solo los usuarios listados en él podrán editar sus crontabs. Si ambos archivos existen y el mismo usuario aparece en cada uno, 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 ricardogeek, puede usar la siguiente secuencia de comandos:
$> sudo echo ALL >>/etc/cron.deny
$> sudo echo ricardogeek >>/etc/cron.allow
Primero, bloqueamos a todos los usuarios agregando TODOS 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 trabajos cron.
Tenga en cuenta que si un usuario tiene privilegios de sudo, puede editar el crontab de otro usuario con el siguiente comando:
$> sudo crontab -u user -e
Sin embargo, si existe cron.deny y el usuario aparece en él y no aparece en cron.allow, recibirá el siguiente error después de ejecutar el comando anterior:
The user <su_usuario> cannot use this program (crontab)
Por defecto, la mayoría de los daemons cron supondrán que todos los usuarios tienen acceso a cron a menos que cron.allow o cron.deny existan.
Conclusión
Cron es nuestra herramienta aliada favorita para automatizar cosas que nos aburren!
Usenla con responsabilidad 🙂