cron: Programar/Automatizar tareas en Linux

publicado a la‎(s)‎ 13 oct. 2015 7:19 por Juan Jose Ramirez Lama   [ actualizado el 13 oct. 2015 7:23 ]

Imagina que quieres programar una tarea para que se ejecute periodicamente, o en un determinado momento.Por ejemplo, hacer una copia de seguridad de tus archivos el dia 1 de cada mes, o cambiar el fondo de escritorio cada30 minutos. Para programar tareas en Linux, existe un servicio llamado “cron“.


¿Que hace este servicio?

Es un proceso que lee un archivo donde le indicamos las tareas y cuando queremos realizarlas y el se encarga de ejecutarlas por nosotros en el preciso momento que le hayamos indicado.


Pero antes un poco de culturilla. Cron viene de “cronos” y Cronos segun la mitologia griega era el Dios del tiempo.

Y eso es lo que vamos a hacer con “cron”, controlar el tiempo..


Existen utilidades graficas para programar tareas, pero antes lo veremos desde la linea de comandos, pues definir la tarea y el intervalo de ejecucion tampoco es muy complicado.


Si queremos definir una tarea para cron emplearemos el comando “crontab“. Admite los siguientes parametros:

$ crontab -l


Para mostrar un listado de las tareas actuales del usuario


Ejemplo:

root@soledad:~# crontab -l

# m h dom mon dow command

* * * * * echo `date` > /home/jose/Desktop/cron.txt


$ crontab -e


para editar este archivo de tareas que lee el servicio “cron”

$ crontab -r


elimina el archivo crontab del usuario

$ crontab


instala el archivo indicado como archivo crontab del usuario


Bueno, la opcion que nos interesa principalmente es “-e”, con esta opcion creamos (si no existia ya) o editamos el archivo crontab del usuario actual.


Estos archivos se van dejando en /var/spool/cron/crontabs


Todos estos archivos de crontab siguen la misma sintaxis. En ellos tenemos una linea por cada tarea o accion

a ejecutar y esta linea es de la forma:


minutos horas dia-del-mes mes dia-de-la-semana comando


El valor que puede tomar cada campo es como sigue:


- minutos va de 0 a 59 y representa el minuto en que se ejecuta
- horas va de 0 a 23 y representa la hora en que se ejecuta
- dia-mes va de 1 a 31 y es el dia del mes en que se ejecuta
- mes va de 1 a 12 y representa el mes que se ejecuta
- dia-semana va de 0 a 7 y el el dia de la semana en que se ejecuta (
el domingo se puede indicar con el 0 o con el 7)
- comando es el comando a ejecutar


Existe un caracter comodin que es el asterisco “*”, con el se indica “Todo” es decir todos los minutos, o todos los meses,

o todos los dias.


Tambien se admiten rangos, p.ej: 0-30 indicaria todos los valores de 0 hasta 30, o 15,30,45 indicaria tres valores: 1530 y 45


Como comando podemos poner un comando o la ruta a un shell script que queramos ejecutar.


¿Parece complicado?. No, no lo es. Quedara mas claro cuando veamos un ejemplo:


Imagina el siguiente caso:

30 10 * * * tar -cvf /tmp/documentos.tar /home/juaramir/documentos


Esta linea ejecutaria el comando

tar -cvf /tmp/documentos.tar /home/juaramir/documentos

Todos los dias (*), todos los meses (*), todos los dias de la semana (*) a las 10:30

y me serviria para sacar una copia de seguridad de mi carpeta “documentos”.


¿Empiezas a ver las posibilidades?

Podemos programar tareas que se ejecuten cada hora, o cierto dia del mes, o todos los meses, o todos los dias, o solo los

sabados, o miercoles, etc.

Todo depende de la combinacion de valores que pongas en esos campos.


Asi que, todas esas tareas periodicas que realizas ocasionalmente (un script para que me limpie de fi archivo heros no necesarios, copias de seguridad, recordatorios, etc) podrian ser programados para ejecutarse de manera automatica.


Vamos a hacer un ejemplo sencillo para que veas como funciona el “mecanismo” de este reloj.


Con tu usuario ejecuta el siguiente comando:

$ crontab -e


aparece un pequeño editor que te permite modificar el archivo crontab actual.


Desplazate hasta la linea por debajo de:

# m h dom mon dow command


y escribe lo siguiente:

* * * * * echo `date` > /home/juaramir/Desktop/cron.txt


Sustituyendo “jose” por el nombre de tu usuario. Lo que acabamos de hacer es “programar” una tarea para el cron. Podriamos ir añadiendo tareas nuevas (siempre 1 en una linea nueva) y se ejecutarian cuando correspondiese.


Con Control+O guardas los cambios y con Control+X terminas.


Asegurate de que la linea escrita siga el formato que vimos arriba (minuto, hora, mes, etc…) pues en otro caso “cron”

no la entendera, te dara un error y no la ejecutara.


¿Y que estamos haciendo con esta tarea?

Pues algo muy tonto, pero para que compruebes in “situ” sus posibilidades.


con echo `date` estamos obteniendo la fecha actual y la estamos enviando “>” a un archivo llamado cron.txt que
se guardara en nuestro escritorio.


Como estamos ejecutando ese comando, todos los minutos(*), todas las horas(*), todos los dias(*), etc..
El efecto sera que cada minuto, cambiara el valor almacenado en ese archivo y lo puedes ver facilmente
editando el archivo “cron.txt” que se estara guardando en tu escriotorio cada minuto.


Si todo ha ido bien, podras ver como cada minuto se modifica el contenido de ese archivo con el instante de tiempo actual.


Si te complicas con la linea de comandos, puedes hacer esto mismo con utilidades graficas como son Kcron (en KDE) , o grontab y  gnome-schedule en Gnome.


Te voy a poner ahora otro ejemplo mas interesante. Sacar un backup de tu carpeta home.


Para ello emplearemos este comando:

$ tar -jcvf /tmp/CopiaTotal_etc-home_`date +%d%b%y`.tar.bz2 /home /etc

Que nos comprime y empaqueta a .tar.bz2 nuestras carpetas /home y /etc dejandonos en el directorio /tmp con el nombre

“CopiaTotal_etc-home y la fecha”. Este comando seria para una copia “total”, si ya tuvieramos un backup realizado y solo

quisieramos añadir los archivos nuevos o modificados, ejecutariamos un backup diferencial:

$ tar -jcvf /tmp/CopiaDiferencial_etc-home_01`date +%b%y`-`date +%d%b%y`.tar.bz2 /home /etc -N 01`date +%b%y`

Bueno, esto esta muy bien para comandos simples, pero ¿y si quiero hacer algo mas complejo?


Pues como te he dicho antes. En la linea de “comando” del cron no solo puedes poner un comando.

Tambien puedes, programarte un shell script que hiciera lo que tu quisieras y despues lo llamas.


Podria ser algo como esto:

15,30,45 11-12 1,2,3 * * /home/jose/scripts/cambia_wallpaper.sh > /tmp/out.txt 2>/tmp/error.txt


que es:


cada dia 1,2 y 3 de todos los meses.
Para las horas 11 a 12
y minutos 15, 30 y 45
ejecutame el script:


/home/juaramir/scripts/cambia_wallpaper.sh


A este ejemplo le añado 2 redirecciones, que suelen ser utiles cuando estas depurando y quieres guardar trazas

de lo que esta pasando.


> /tmp/out.txt

me guarda la salida del shell script (p.ej las lineas que imprima con un “echo”) en el archivo /tmp/out.txt


y


2> /tmp/error.txt

me envia los errores que se produzcan al archivo error.txt (si estas programando un cron que no te funciona, no estariade mas generar una salida de error y consultarla para ver que esta pasando).


Es un ejemplo ficticio, pero solo para que puedas ver el juego que da crontab a la hora de definir rangoshorarios. Si necesitas el script “cambia_wallpaper.sh”, puedes mirar el post que escribi ayer.


Esto solo ha sido una pequeña introduccion a “cron”, en internet podras encontrar muchos mas tutoriales sobre esta “pequeña”, “precisa” y “potente” herramienta.


!!!Cuidado!!!, Cuidado con el demonio del tiempo!!!


fuente: http://ubuntulife.net

Comments