jueves, 3 de enero de 2008

Cron: Programar/Automatizar tareas en Linux

Fuente: UbuntuLife

Por ejemplo, hacer una copia de seguridad de tus archivos el dia 1 de cada mes, o cambiar el fondo de escritorio cada
30 minutos. Para programar tareas en Linux, existe un servicio llamado “cron“.

Imagina que quieres programar una tarea para que se ejecute periodicamente, o en un determinado momento.

¿Que hace este servicio?
Es un proceso que lee un fichero 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 fichero de tareas que lee el servicio “cron”

$ crontab -r
elimina el fichero crontab del usuario

$ crontab
instala el fichero indicado como fichero crontab del usuario

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

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

Todos estos ficheros 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: 15, 30 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/jose/documentos

Esta linea ejecutaria el comando

tar -cvf /tmp/documentos.tar /home/jose/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 ficheros 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 fichero crontab actual.
Desplazate hasta la linea por debajo de:

# m h dom mon dow command

y escribe lo siguiente:

* * * * * echo `date` > /home/jose/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 fichero 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 fichero y lo puedes ver facilmente
editando el fichero “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 fichero 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.

En la siguiente imagen puedes ver el aspecto de Kcron:

kcron.jpg

Te voy a poner ahora otro ejemplo mas interesante. Sacar un backup de tu carpeta home. Tal y como puedes ver aqui.

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 ficheros 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`

Vale, 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/jose/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 fichero /tmp/out.txt

y

2> /tmp/error.txt
me envia los errores que se produzcan al fichero error.txt (si estas programando un cron que no te funciona, no estaria
de 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 rangos
horarios. 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!!!

Mas informacion | AlejandroX

No hay comentarios: