lunes, 29 de noviembre de 2021

Trucos para usar Cron como asistente de tareas.


 ¿Que es Cron y para que sirve?


Cron es una administrador de tareas de Linux que nos permitirá ejecutar comandos para por ejemplo realizar copias de seguridad, borrar archivos u otras tareas en un momento determinado. (cada hora, mes, en una fecha en concreto etc) y sin que nos tengamos que preocupar por ello. Es un demonio, un proceso que se ejecuta en segundo plano.

Cada usuario del sistema tiene lo que se llaman tablas de cron o "crontab". No es más que un archivo de texto, que posee una lista con todos los script o tareas a ejecutar. Podemos editarlas, verlas o incluso borrarlas. Además los usuarios podemos usar esas "crontab" para programar tareas. El programa "Cron" por si mismo, monitoriza automáticamente sus crontab y se asegura de cualquier trabajo que aparezca en un crontab se ejecute en el momento especificado.

Configurando Cron.


Podemos editar nuestro crontab particular usando el comando "crontab" junto con la opción -e (editar).  Si por defecto no tienes un editor predeterminado puedes establecerlo editando el archivo ~/.bashrc o incluso en el propio programa al ejecutar la orden. 

Yo voy a configurar el mío para que use "nano" y "gedit". La variable de entorno EDITOR establece que programa de edición usaremos cuando usemos el terminal, mientras que la variable VISUAL define que editor se usará en modo gráfico.

Abrimos el terminal y editamos el archivo ~/.bashrc

pi@raspberrypi:~ $ nano ~/.bashrc

y al final del mismo añadimos:

export EDITOR=nano
export VISUAL=gedit
Nota. He usado el editor nano como editor de terminal y gedit como editor en modo grafico, pero puedes usar el que más te guste.


Guardamos el archivo y refrescamos nuestra sesión de shell para que tenga en cuenta los nuevos cambios:

pi@raspberrypi:~ $ source ~/.bashrc
Ahora ya podemos editar o crear las "crontab" con nuestro editor preferido:


pi@raspberrypi:~ $ crontab -e
crontab -e


Programando una tarea.


El sistema cron funciona esencialmente como un calendario. Podemos decirle con que frecuencia queremos ejecutar un trabajo mediante el uso de cinco parámetros diferentes:

minuto, hora, día del mes, mes y día de la semana.

Los parámetros siguen este orden estricto, aunque veras que no es muy intuitivo. Para empezar, podemos pensar que el programa está configurado para ejecutar algo, siempre o cada x tiempo.



opciones de configuración de crontab



Veámoslo con un ejemplo. Si añadiésemos la siguiente entrada:


* * * * * touch /tmp/hola

Ejecutaríamos la orden touch /tmp/hola cada minuto, de cada hora, de cada día, durante todo el año. Vamos para siempre.

Lógicamente podemos restringir esto un poco, estableciendo valores a cada uno de los atributos. Por ejemplo para que la orden se ejecute en el minuto 30 podemos usar:

30 * * * * touch /tmp/hola

Podemos acotar un poco más añadiendo que se ejecute a una hora especifica (formato de 24 horas). Esta orden ejecuta el comando a las 3.30 am de cada día, todas las mañanas:

30 3 * * * touch /tmp/hola

También podemos hacer que se ejecute a esa hora pero solo los primeros días de cada mes:

30 3 1 * * touch /tmp/hola

Para poner el mes usaremos la forma numérica. El 1 para Enero, el 2 para febrero y así sucesivamente hasta el 12 para Diciembre. 

Lo mismo ocurre si queremos especificar los días de la semana, aunque tendremos que hacerlo en el orden anglosajón.  Es decir la semana comienza en Domingo y termina el Sábado. De esta forma el Domingo es el 0, el lunes el 1, el martes el 2, el miércoles el 3, el jueves el 4, el viernes el 5 y el sábado el 6.

Para verlo mejor. Si queremos que la tarea se ejecute a las 3 horas y 30 minutos durante el mes de abril pero sólo los lunes:

30 3 0 4 1 touch /tmp/hola

Usar Incrementos.


En todos los ejemplos anteriores hemos usado valores exactos. Pero también podemos usar cron para que ejecute una tarea pasado un periodo de tiempo. Por ejemplo podemos programar una tarea para que se repita cada 15 minutos, ojo ¡no en el minuto 15!

*/15 * * * * touch /tmp/hola
o podemos ejecutarla a las 10 de la mañana cada 3 días:

* 10 */3 * * touch /tmp/hola
o programarla para cada 6 horas:

* */6 * * * touch /tmp/hola

Formas abreviadas de Cron.


En las implementaciones más modernas de Cron también podemos usar una forma abreviada en lugar de la estructura que hemos visto anteriormente. Estas son:
  • @hourly - todas las horas durante su primer minuto = 0 * * * *
  • @daily - todos los dias a las 12 de la noche = 0 0 * * *
  • @weekly - todas las semanas, el primer minuto de la primera hora de las semana
             = 0 0 * * 0    
  • @monthly - todos los meses el primer dia = 0 0 1 * *
  • @yearly or @annually - se ejecuta una sola vez al año = 0 0 1 1 *
  • @reboot - se ejecuta una vez y nada más iniciarse el equipo.


Listar las tareas de Cron.


Usando la siguiente instrucción, podemos ver una lista con las tareas que tenemos en crontab.

$ crontab -l
15 3 * 4 1 touch /tmp/hello

Eliminar un Crontab.


Para eliminar un crontab  lo podemos hacer usando -r. Le podemos añadir también el parámetro -i para que sea interactivo es decir nos pregunte si estamos seguros de hacerlo.


crontab -r -i

Otras cosas sobre Cron.


- Cron es un demonio que ejecuta tareas, por lo que si en el momento de ejecutarlas el ordenador está apagado estas no se realizarán. Si queremos superar esta limitación podemos usar un programa llamado anacron que controlará si Cron ha ejecutado las tareas que tenía asignadas.

- Puede usar un generador en línea para crear el momento en que ejecutar la tarea. Por ejemplo Cron Job Generator te puede echar una mano.

- La tarea a ejecutar la puedes poner directamente, si es un comando sencillo. O puedes crear un script de bash con lo que quieras ejecutar (acuérdate de darle permisos de ejecución o no funcionará). Por ejemplo el siguiente script abre firefox en una ventana gráfica (Hay que poner un DISPLAY para abrir cualquier aplicación en un entorno gráfico):

tarea.sh 

#!/bin/bash

env DISPLAY=:0 firefox
todo los días a las 20:38 pm

crontab

38 20 * * * /home/pi/tarea.sh



No hay comentarios:

Publicar un comentario