martes, 21 de septiembre de 2010

Tareas programadas con Cron

Al poco tiempo de empezar a tratar con un servidor Linux te das cuenta de que tarde o temprano vas a utilizar una tarea programada. Puede ser que necesites realizar una copia de seguridad cada X tiempo, vaciar una cola de correos, o simplemente controlar que todo está en su sitio.

Sabía desde hace tiempo que algún día hablaría con Don Cron. Llevábamos una temporada mirándonos a la cara, con tono desafiante. Aún conociéndole de oídas, me ha impresionado la potencia y las opciones disponibles de este demonio.

Quién es Cron, y donde lo puedo encontrar

Cron se encarga de ejecutar las tareas programadas que se configuren en el sistema. Probablemente, y aunque depende de tu distribución Linux, en /etc encuentres varios directorios llamados cron.hourly, cron.daily, cron.weekly, cron.monthly. En estos directorios se encuentran los scripts que se ejecutan cada hora, cada día, cada semana, etc...

Uso básico de Cron

Si dejáramos un script en cualquiera de estos directorios se ejecutaría en el momento que proceda. Por ejemplo, si creamos un script que realice una copia de seguridad de nuestros archivos y lo colocamos en cron.daily, este script se ejecutará una vez al día.

Uso avanzado de Cron

Tal vez el uso de los directorios cron.* no satisface nuestras necesidades de configuración para la tarea que queremos programar. En este caso programaremos las tareas a través del archivo crontab.

Esta es, dadas las posibilidades que ofrece, la forma más interesante de utilizar Cron. El archivo en cuestión se encuentra en el directorio /etc, y tiene un formato parecido a este:

SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1


Pasemos a explicar cada una de las partes de este archivo. En primer lugar las primeras cuatro líneas, que contienen variables para Cron.

SHELL, la cual nos indica el shell con el que se ejecutarán las órdenes de Cron. En caso de no asignar valor o de no existir la variable, se tomará el shell del usuario que ejecuta Cron.

PATH, contiene o indica la ruta a los directorios en los cuales cron buscará el comando a ejecutar. Este path es distinto al path global del sistema o del usuario.

MAIL TO es a quien se le envía la salida del comando (si es que este tiene alguna salida). Cron enviará un correo a quien se especifique en este variable, es decir, debe ser un usuario válido del sistema o de algún otro sistema. Si no se especifica, entonces cron enviará el correo al usuario propietario del comando que se ejecuta.

HOME es el directorio raíz o principal del comando cron, si no se indica entonces, la raíz será la que se indique en el archivo /etc/passwd correspondiente al usuario que ejecuta cron.

Tras las líneas con las variables entramos en materia, y empezamos a econtrarnos con líneas de ejecución de tareas. cada una de estas líneas tiene un formato parecido a este:

minutos | horas | día-mes | mes | día-semana | usuario | script

40 * * * * root /etc/scripts/tareaProgramada1.sh

En la primera parte de la linea tenemos la definición del momento en que se ejecutará la tarea.En caso de tener un * en alguno de los campos, significará que se ejecutará la tarea para cada uno de los valores posibles. De esta forma en el ejemplo el script se ejecutará en el minuto 40 de cada hora, cada día de cada semana de cada mes.

El siguiente campo de la línea especifica el usuario que ejecutará el script, y después tenemos la ruta donde tenemos el script que queremos ejecutar. Tendremos que tener en cuenta que el script tiene asignado el permiso de ejecución, y que el usuario que lo tiene que ejecutar tiene permisos sobre el archivo.

Configuración del tiempo de ejecución

Una de las ventajas de Cron es la posibilidad de configurar el momento exacto en que se ejecutará una tarea. Las posibilidades son prácticamente infinitas, por lo que vamos a ver unos ejemplos que nos harán tenerlo más claro.

- Aparte de ejecutar una tarea en un momento concreto, también podemos ejecutarla cada X tiempo. Para esto podemos utilizar la /. Veamos un ejemplo.

15 */2 2/3 * * root /etc/scripts/tareaProgramada1.sh

En este ejemplo el script se ejecutará en el minuto 15 de cada 2 horas, cada 3 días a partir del día 2 de cada mes. La primera ejecución será el próximo día 2 a las 0:15. Hay que tener en cuenta que si no especificamos el incio para el periodo de repetición Cron tendrá en cuenta el primer valor válido. Con */2 se tomará como inicio la hora cero. Con 2/3 se contará de tres en tres, a partir del 2.

- En el caso de que lo necesitemos, también podemos especificar los valores concretos en que queremos configurar la ejecución de la tarea. Utilizando la , podemos dar varios valores a un campo del tiempo de ejecución.

15 7,14 * * * root /etc/scripts/tareaProgramada1.sh

La tarea se ejecutará a las 7:15 y las 14:15 de cada día.

- Podemos también configurar el día de la semana en que se ejecutará la tarea. Nos valdría si lo que queremos es lanzar un proceso muy largo y necesitamos que no haya nadie, por ejemplo el fin de semana. Para el día de la semana podemos utilizar números (del 0 al 7), o con las tres primeras letras del día en inglés. Si se usan numeros hay que tener en cuenta que tanto el 0 como el 7 es el domingo.

15 7 * * sun root /etc/scripts/tareaProgramada1.sh
15 7 * * 7 root /etc/scripts/tareaProgramada1.sh
15 7 * * 0 root /etc/scripts/tareaProgramada1.sh

Con estas tres lineas ejecutaremos la tarea a las 7:15 del domingo.

- Otra opción interesante es configurar un rango de valores para los que se ejecutará la tarea. Utilizaremos el - entre dos valores para especificar un rango. Vamos con un ejemplo.

15 7-14 * * 7 root /etc/scripts/tareaProgramada1.sh

En el ejemplo ejecutaremos la tarea los domingos, en el minuto 15 de 7 a 14 horas. La primera ejecución será a las 7:15 y la última a las 14:15.

- Ahora, si combinamos las diferentes formar de configurar una tarea, podemos ver casos como este:

*/15 8-18/2 10 5 sat root /etc/scripts/tareaProgramada1.sh

La tarea se ejecutará cada 15 minutos, entre las 8 de la mañana y las 6 de la tarde cada dos horas, el día 10 de mayo, siempre que ese día sea sábado.

Este ejemplo sirve para entender que las tareas se ejecutarán sólo si se cumple cada una de las condiciones especificadas. Es posible que tarde años en llegar un sábado 10 de mayo (el último fue en 2008), por lo que hay que tener bastante claro que las condiciones que configuremos tengan algo de sentido.

Ahora ya sabemos programar tareas en nuestro Linux, y lo mejor de todo es que esto es sólo una parte de las cosas que puede hacer Cron. Seguro que volvemos a vernos.

No hay comentarios:

Publicar un comentario