Programando tareas con cron
Para el que no tenga la más pálida idea de qué es cron, les comento que este es el administrador de tareas ejecutadas automáticamente en sistemas *nix, en horarios definidos o cada cierto intervalo de tiempo. Digamos por ejemplo que quieren que todos los días al mediodía el sistema chequee en busca de actualizaciones, esto se podría hacer muy fácilmente utilizando una entrada en el cron.
Cron es muy flexible y permite programar tareas para que se ejecuten cada cierto intervalo de tiempo, en determinado día de la semana, en determinado día del mes, y para usarlo solo necesitan saber lo que les explico a continuación.
Cabe mencionar que el cron utilizado en las distribuciones de linux es una versión extendida del cron original. La más reconocida es Vixie Cron, y es sobre la cual realizaré la explicación.


Quién puede programar tareas?

Cualquier usuario del sistema puede utilizar cron para programar tareas, siempre y cuando éste no se encuentre listado en el archivo cron.deny, o bien, si existe el archivo cron.allow, el usuario debe estar listado en él.
Para que tengan más claro el sistema de permisos allow/deny, cabe aclarar lo siguiente:
- si no existen ni el archivo cron.allow ni cron.deny, cualquier usuario puede ejecutar tareas programadas.
- si existe el archivo cron.allow, el usuario debe estar listado en el para poder ejecutar tareas programadas. En este caso, no importa lo que haya en cron.deny, si existe cron.allow, se ignora el contenido de cron.deny.
- si no existe cron.allow, pero sí cron.deny, el usuario NO deberá estar listado en este último para poder programar tareas.


Bien, dónde coloco la tarea a realizar?

Para programar tareas, el usuario debe utilizar el comando crontab, el cual le permitirá editar el archivo crontab correspondiente a su usuario. Como se habrán dado cuenta, cada usuario tiene su propio archivo crontab donde se almacenan las tareas programadas, en debian estos archivos pueden encontrarse en /var/spool/cron/crontabs/, pero no es aconsejable que los editen a mano, dado que un cambio directo en el archivo puede que no se vea reflejado en la instancia de cron en memoria, por lo que sus trabajos quizás no se ejecuten.
Al ejecutar crontab -e, el sistema nos abre nuestro crontab con un editor predeterminado. Si quieren utilizar un editor en particular, deberán setear la variable de entorno EDITOR. Si por ejemplo quieren editar el crontab con nano, primero deberán ejecutar "export EDITOR=/bin/nano".
Por otro lado, para ver si crontab actual, pueden ejecutar crontab -l. Por supuesto que root puede ver cualquier crontab, y esto lo hace ejecutando crontab -u -l.
Otras opciones interesantes de este comando son -r para remover el crontab actual, y -v para ver cuándo lo editamos por última vez.
Para saber un poco más sobre el comando crontab, RTFM!, es decir "man crontab" y "man 5 crontab".


Formato de los crontab

Vamos, llegó la parte interesante, el formato del ya recontra nombrado crontab. Cada entrada en el crontab cuenta con 5 campos, correspondientes al día, fecha y hora seguidos del comando a ejecutar, tomando la siguiente forma:

* * * * * comando a ejecutar
| | | | |
| | | | +---- día de la semana (0 - 6) (domingo=0 or 7) o bien sun,mon,tue,wed,thu,fri,sat
| | | +------- mes (1 - 12) o jan,feb,mar,apr ...
| | +---------- día del mes (1 - 31)
| +------------- hora (0 - 23)
+---------------- minuto (0 - 59)

En cada columna podemos especificar un valor de los mostrados en la figura, o bien pueden introducir varios valores utilizando diferentes operadores. Nunca deben introducirse espacios entre el operador y los valores, dado que el espacio es interpretado como si nos refiriésemos a otra columna. Los operadores que podemos utilizar son:
- La coma (','), que nos permite especificar una lista de valores, por ejemplo "1,2,5,6"
- El guión ('-') nos permite especificar un rango de valores, por ejemplo "1-8", lo cual es equivalente a "1,2,3,4,5,6,7,8"
- El asterisco ('*') que indica que ese campo puede tomar todos los valores. Por ejemplo, un asterisco en el campo de la hora, indicará que el comando se ejecute a cada hora (siempre sujeto a lo que indiquen los otros campos).
- La barra ('/') que podemos utilizar para saltar un dado número de valores. Por ejemplo, "*/3" en el campo de la hora es equivalente a colocar "0,3,6,9,12,15,18,21". El fundamento del ejemplo es que el "*" nos indica que se ejecute cada hora, pero el "/3" especifica que utilice sólo las horas divisibles por 3.

El comando a ejecutar puede ser cualquier comando ejecutable, incluso un script creado por nosotros mismos, o algún programa compilado. Cualquier ejecutable es válido.


Ejemplos salva papas

Siempre uno necesita ejemplos para aclarar lo explicado, así que ahí van algunos:

Como cité antes, supongamos que queremos mantener nuestro sistema actualizado, y queremos que se actualice todos los días (si es que hay actualizaciones) a las 12.15. Para esto, podríamos agregar una entrada en nuestro crontab que tenga el siguiente formato:

15 12 * * * apt-get upgrade &> /home/user/update_log.txt

En el ejemplo redirigí la standar output y la standar error a un log, así en caso que algo suceda, podremos verificarlo en un bonito log.

Ahora supongamos que queremos correr un script de backup todos los viernes a las 03:00, la entrada sería como la siguiente:

0 3 * * 5 backup

Por último, les dejo un ejemplo sin mucha utilidad, pero que demuestra el poder de cron. Supongamos que queremos que el 28 de febrero de cada año el sistema nos imprima en un log cada 5 minutos que hoy es 28 de febrero... ejemplo re loco =D La sintaxis sería la siguiente:

*/5 * 28 2 * echo "es 28 de febrero!" > /home/user/febrero.log

Jueguen con las opciones para obtener diferentes resultados, y lograr lo que desean.


Variables de entorno

En nuestro crontab, además de los trabajos que queremos ejecutar, podremos editar algunas variables de entorno, para que se adapten a nuestras necesidades. Es así como podemos decirle a cron que ejecute los comandos utilizando el shell bash y/o especificarle el path de los binarios.
Al principio de nuestro crontab podríamos tener algo como lo siguiente:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games


Crontab del sistema

Así como existe un crontab para cada usuario, también existe uno para el sistema, es decir, para ejecutar tareas del sistema. El archivo designado para tal labor es el /etc/crontab. En este crontab podrán agregar cualquier tarea que deseen realizar, y ejecutarlas a nombre del usuario que más les guste. A diferencia de los crontab de usuario, no deberán utilizar el comando crontab para editarlo.
Si hechan un vistazo este crontab, encontrarán que tiene un formato ligeramente diferente y en muchas distribuciones, ya contiene algunas entradas default.
En este crontab, además de las columnas especificadas anteriormente, también contiene una columna donde se indica el nombre de usuario, a nombre del cual se ejecutará el comando.
Este nuevo formato es el siguiente:

* * * * * usuario comando a ejecutar

Los asteriscos tienen el mismo significado que antes, la única diferencia es que se incluye el nombre del usuario.
Como dije antes, muchas distribuciones traen entradas default en el crontab, estas suelen ser (por ejemplo en debian):

17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Estas entradas predefinidas permiten que un usuario ejecute tareas a cada hora, diariamente, semanalmente o mensualmente, simplemente colocando un script o un link en las carpetas /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly.


Interfaces gráficas

Para el que no es muy amigo de la consola, también puede encontrar interfaces gráficas para manejar cron. Las que encuentro más interesantes son kcron para kde y gnome-schedule para gnome.


Algunas otras referencias:

Si bien traté de cubrir las partes más importantes para que puedan utilizar cron en sus tareas diarias, siempre algo queda fuera, además, por si quieren leer algunos ejemplos más que les aclare la idea, les dejo los siguientes links:
http://www.adminschoice.com/docs/crontab.htm
http://www.centos.org/docs/4/html/rhel-sag-en-4/ch-autotasks.html
https://help.ubuntu.com/community/CronHowto
http://en.wikipedia.org/wiki/Cron
http://www.linuxjournal.com/article/3290
http://www.debian-administration.org/articles/56
http://www.softpanorama.org/Utilities/cron.shtml
http://www.debianhelp.co.uk/schedulejobs.htm

0 comentarios:

Publicar un comentario