Apuntes mientras aprendo sobre software y computadoras.

Linux

Cómo usar cron y crontab en Linux


Sigo avanzando con estos apuntes para aprender cada vez más en profundidad el sistema operativo Linux.

Esta vez vamos a conocer los detalles de cron, crontab y cronjob para poder crear rutinas de comandos y organizar tareas.

Y este texto es parte de un proyecto más grande, se trata de un capítulo dentro de la “Guía mínima para empezar con la terminal de Linux”.

Por todo esto y sin otra introducción…

¿Qué es cron?

Según el manual de instrucciones:

NAME
cron – daemon to execute scheduled commands

del manual de cron

Según esto, puedo entender que Cron es una utilidad de segundo plano que sirve para crear rutinas dentro de la computadora.

Dicho de otro modo, cron permite agendar comandos para su ejecución en el futuro o a intervalos regulares de tiempo.

Utilizando cron puedo organizar y automatizar tareas.

¿Qué es cron tab?

Para conseguir crear esas rutinas de acciones, primero tengo que definir cuales son esas tareas dentro de un archivo dedicado para tal efecto.

Ese archivo se conoce por cron tab, y también como “cron table” o “tabla cron”.

Sobre esto, el manual de instrucciones dice:

NAME

crontab – maintain crontab files for individual users (Vixie Cron)

Del manual de crontab

Y luego agrega:

crontab is the program used to install, deinstall or list the tables used to drive the cron(8) daemon (…)

Del manual de crontab

Entonces, cron tab es lo que permiteestablecer la ejecución de diferentes acciones y actividades en el futuro.

¿Qué es cron job?

Cron job es el nombre de una tarea específica dentro de la tabla. Literalmente es un trabajo dentro de cron.

En resumen, lo que busco hacer es agendar la ejecución de comandos que van a realizarse cada cierto intervalo de tiempo.

Por ejemplo, reiniciar la máquina cada cuatro horas es un cron job determinado. O hacer el respaldo de una carpeta determinada cada nueve días, esa es otra tarea o cron job dentro de la cron tab.

Cron: primeros detalles

Cada cuenta individual dentro del sistema tiene su propio cron tab.

Lo que cada cuenta puede poner en este calendario depende de sus niveles de permiso. Como siempre, lo que puedo o no hacer depende de los permisos de administración.

La mayoría de las distribuciones de Linux vienen con cron dentro de su instalación. Si no lo encuentro dentro de la versión que estoy usando, siempre puedo instalarlo.

Para editar la tabla cron, el comando que necesito es:

crontab -e

Lo más seguro es que en un primer momento el archivo crontab se va a abrir en el editor de texto Vim.

Pero si es la primera vez que estoy usando el comando, Linux va a preguntarme con que editor de texto quiero abrir el archivo. Más específicamente, la terminal me dice:

Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]:

La opción 1, el editor nano, es la opción más sencilla entre todas. Es un buen programa, fácil de usar. Y si no tengo ese editor instalado, puedo agregarlo fácilmente con el comando:

sudo apt install nano

Pero puedo elegir cualquier opción de editor, siempre hay oportunidad de cambiarla más tarde. Voy a volver sobre eso luego.

Comenzar con crontab

Entonces, ya escribí el comando:

crontab -e

Y se me aparece un nuevo archivo en el procesador de texto.

Al recibirme, este documento tiene una buena muralla de texto explicando como funciona todo.

Para resumir, considero que lo importante de toda esa explicación es:

-cada tarea que predefinida en la tabla cron va a ocupar una nueva linea de texto.

-cada tarea programada tiene que estar escrita con una sintaxis específica.

¿Una sintaxis especifica? Eso me lleva a…

¿Cómo escribir una entrada en crontab?

Cada tarea cron que ingreso en el archivo tiene básicamente seis partes posibles:

MIN HOUR MDAY MON DOW COMMAND

¿Qué significa todo eso? Bueno, puedo traducirlo de esta forma:

|min.| |hora| |día del mes| |mes| |día de la semana| |comando|

Para planificar una actividad por medio de cron, tengo que especificar primero en cuanto tiempo va a ejecutarse la acción y luego el nombre del comando. Nada más. Entendido de este modo, el asunto se pone un poco más sencillo.

Las posibles opciones de tiempo quedan así:

TiempoValor
MinutoEntre 0 y 60
hora [en formato de 24 horas]Entre 0 y 23
Día del mesEntre 1 y 31
MesVa entre 1 y 12
Día de la semana0-6 (0 representa domingo y así en adelante hasta el 6 que representa el sábado)
Opciones de tiempo Cron

¿Qué comando puedo utilizar?

Puedo usar cualquier comando que funcioné en la terminal. Pero no solo eso, también puedo ejecutar scripts propios, por ejemplo programas creados en bash.

Voy a revisar un ejemplo, tengo que recordar que la sintaxis de la tabla cron es:

|min.| |hora| |día del mes| |mes| |día de la semana||comando|

Entonces, si quiero que una acción ocurra de lunes a viernes, todas las noches a las 22:30 horas, la planteo como:

30 22 * * 1-5

¿Que quiere decir esto? 30 indica treinta minutos. Sigue la hora, las 22. Esto es las 22:30 horas., si mal no lo estoy interpretando.

Luego siguen dos asteriscos, porque no estoy marcando un periodo especifico de meses o días del mes.

El asterisco (*) se usa para decir algo como “incluir todas las opciones”. Es una wildcard. En este caso incluyo al utilizar el asterisco todos los meses, y todos los días del mes.

Luego sigue un intervalo de 1-5. Como mencioné antes, el 0 representa al domingo. Siendo que busco ir del lunes al viernes, el intervalo es del 1 al 5. El guion (–) se usa para marcar intervalos.

¿Y cual es nuestro comando? Bueno, como no quiero ir a dormir tarde, voy a hacer que se apague la computadora con el comando shutdown.

30 22 * * 1-5 shutdown -h

Y listo, con eso tengo mi primera tarea programada dentro del archivo crontab.

Digamos que en lugar de un comando, quiero ejecutar un script para la terminal escrito con anterioridad. Lo puedo señalar de la siguiente forma, apuntando al lugar donde el archivo se encuentra guardado:

30 22 * * 1-5 /camino/directorio/script.sh

Aunque bien pensado, también es cierto que puedo convertir ese script de bash en un comando agregándolo al commanth path. Al hacerlo, simplemente lo agrego al crontab igual que un comando regular.

¿Cómo saber qué tareas tengo programadas en crontab?

Para ver que tareas hay puestas en mi archivo crontab, agrego la opción -l en el comando:

crontab -l

Y voy a recibir una lista detallada de las cosas que puse en mi agenda.

Otras opciones para expandir crontab

Tengo la opción de agregar usar la coma (,) para agregar nuevos intervalos a la ejecución de un comando.

Por ejemplo, imaginemos que hice un programa llamad “recordatorio.sh” y quiero ejecutarlo todos los martes, viernes y domingo a las 9:00 de la mañana. Para eso escribo:

00 9 * * 2,5,0 recordatorio.sh

En el anterior comando, la secuencia “2,5,0” puede leerse como “martes, viernes, domingo”.

Ahora digamos que necesitamos ejecutar ese script cada 25 minutos, siempre.

Para eso necesito usar la barra diagonal (/) que se usa para indicar un rengo de repetición:

*/25 * * * * recordatorio.sh

El */25 indica “repetir en intervalos de 25 minutos”.

¿Cómo cambiar el editor de texto con el que abro el crontab?

Supongamos que mi tabla se abre siempre con Vim, y quiero pasarme al editor Nano.

Tengo entonces que usar este comando al abrir crontab:

export VISUAL=nano; crontab -e

Y con eso le confirmo a Linux que voy a pasar a abrir el crontab con Nano. .

Por otra parte, si ,e interesa que el cambio sea guardado de manera general, y que cualquier archivo de la terminal que necesite un editor de texto utilice nano, escribo en la terminal:

export VISUAL=’nano -w’

Lo que ocurro es que VISUAL es una variable que interviene en varios programas a la vez.

Hay varias formas de elegir si vim, neovim o nano (u otro procesador de texto sin formato) abren un archivo, pero no quiero hacer más largo este apartado.

Si te interesa revisar la variable que estamos modificando, es posible revisar el archivo bash_profile directamente en el directorio:

~/.bash_profile

Ahí es donde encontramos la variable visual, al abrir ese archivo se puede entender más en profundidad.

Otros Atajos en cron:

Para terminar, hay varios atajos que pueden usarse para hacernos más fácil el organizar tareas usando cron y crontab.

Hay una forma de representar lapsos de tiempo preestablecido, lo que nos evita tener que pensar en:

|min.| |hora| |día del mes| |mes| |día de la semana||comando|

Por ejemplo si escribo directamente:

@yearly comando

En lugar de indicar donde van todos los valores de tiempo, la utilización de “@yearly” le avisa al crontab que el comando tiene que ejecutarse una vez por año.

Por revisar otro ejemplo, digamos que quiero ejecutar el script ficticio “ejemplo.sh” al reiniciar la computadora, hago entonces:

@reboot ejemplo.sh

El resto de estos atajos los resumo a continuación:

AtajoAcciónEquivalente en tiempo
@rebootEjecutar al reiniciar.Ninguno
@yearlyEjecutar una vez al año.0 0 1 1 *
@annuallyEjecutar una vez al año.0 0 1 1 *
@monthlyEjecutar una vez al mes.0 0 1 * *
@weeklyEjecutar una vez por semana.0 0 * * 0
@dailyEjecutar una vez al día.0 0 * * *
@midnightEjecutar una vez al día.0 0 * * *
@hourlyEjecutar una vez por hora.0 * * * *

Conclusión:

Aprender a dominar el uso de cron me hace dar un gran salto en el modo que utilizo el sistema operativo.

Por un lado vuelve más sencillos los trabajos repetitivos. Por el otro, me ayuda a organizar mi tiempo sin la necesidad de recurrir al uso de ningún programa extra.

Cuando aprenda algunas cosas nuevas sobre este tema, voy a publicarlas por aquí.

Si te interesa comunicarte conmigo, no te olvides que es posible enviarme un correo electrónico (la dirección se encuentra en la página de “contacto”) o dejar un comentario en la entrada.

Recursos:

Leave a Reply