sábado, marzo 21, 2009

Tareas programadas

Aprovechando que he comentado cositas del crontab en los dos anteriores post, voy a continuar con un caso típico que se suele programar:

Hacemos crontab -e
e introducimos la siguiente tarea:

12 10 * * 1-5 /scripts/exports.sh 1> /scripts/exports.log 2> /scripts/exports.err

Vamos a interpretar lo que significa:

A las 10 horas y 12 minutos,
de todos los días del mes y todos los meses del año,
los días del 1 al 5 de la semana (de lunes a viernes), ejecutar el script /scripts/exports.sh

La redirección 1 es para la salida del script y la redirección 2 para la salida del error si lo hubiera. Aquí lo explican bien: http://www.guia-ubuntu.org/index.php?title=El_Terminal

Supongamos que exports.sh genera una exports de una base de datos Oracle. El fichero podría ser el siguiente en una base de datos 10g:

PATH=$PATH:.
umask 022
ORACLE_BASE=/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
ORACLE_SID=bd
export ORACLE_SID
NLS_LANG=spanish_spain.WE8ISO8859P1
export NLS_LANG
set -x

exp system/passwordsystem@bd file=/oradata/exports/esquema_`date +%d-%m-%Y`.dmp log=/oradata/exports/esquema_`date +%d-%m-%Y`.log owner=esquema consistent=y compress=y

Este script irá generando cada día dos ficheros con estos nombres en /oradata/exports:

esquema_21-3-2009.dmp
esquema_21-3-2009.log
esquema_22_3_2009.dmp
esquema_22-3-2009.log
esquema_23-3-2009.dmp
esquema_23-3-2009.log
esquema_24-3-2009.dmp
esquema_24-3-2009.log
esquema_25-3-2009.dmp
esquema_25-3-2009.log
etc. etc.

Ahora el problema es obvio, hay que automatizar también la limpieza de ficheros.

En hp-ux con el comando rm (remove) no hay forma de indicarle que elimine los ficheros más antiguos que una determinada fecha.

Para ello podemos utilizar el comando find que nos va a seleccionar los ficheros antiguos de la siguiente forma:

Esto nos devuelve los ficheros de hace más de 15 días:
find /oradata/exports -type f -mtime +15

Para ordenar la eliminación de esos ficheros le pasamos el resultado del find como argumento al comando rm:

find /oradata/exports -type f -mtime +15 | xargs rm

Lo único un aviso importante:
¡PELIGRO! Si en lugar de indicar el directorio "/oradata/exports" ponemos por ejemplo "/" a secas probablemente nos carguemos el servidor.

Ese comando compuesto por find y rm habría que guardarlo en un limpiar.sh y programarlo también con el crontab.

Saludos.

No hay comentarios: