jueves, 5 de noviembre de 2009

Comprobando si nuestro programa ya se esta ejecutando

Otra añadido de nuestro programa es la comprobación si ya existe un proceso que se este ejecutando, es decir, que ejecutemos nuestro programa o bien manualmente o bien como tarea programada, y antes de que este termine su ejecución, intentemos ejecutarlo de nuevo.

Para ello lo que hacemos desde nuestro script awk es comprobar si existe un fichero temporal, en caso de que no exista lo creamos y hasta no terminar nuestra ejecución no lo eliminaremos, al estar creado este fichero, en caso de ejecutar de nuevo nuestro programa, este detectará que ya existe ese fichero y que por tanto el programa esta en ejecución para al instante cerrarse, y no entorpecer ni machacar la ejecución anterior.

Para ellos nos ayudamos de las instrucciones BEGIN y END de awk.

Politicas personalizadas

Hasta ahora estabamos trabajando y haciendo busquedas simples, o bien por extension o bien por tamaño, pero eran unas politicas muy rigidas, por eso desde el último post, aproximadamente unas 3 semanas nos hemos dedicado a crear un script awk que permita leer un fichero de configuración en el cual las politicas del usuarios sean lo mas flexibles y configurables posibles.

Trabajamos con 5 posibles filtros de politica, que son:
- Tamaño de fichero.
- Ruta de fichero.
- Fecha último acceso.
- Extensión.
- Caching por partes.

A partir de estas 5 hemos creado sus 5 políticas simples, es decir que filtre por tamaño de fichero, por ruta de fichero, etc, y luego combinatoria de dos y 3 de ellas en cualquier tipo de orden, unos ejemplos:

- Tamaño fichero, extensión, ruta de fichero.
- Ruta de fichero y extensión.
- Extensión, ruta de fichero y tamaño de fichero
...

Dentro de esto cabe destacar que tenemos una expresión regular para cada tipo diferente de política, y que son aproximadamente unas 80 o 90, dentro del script awk también tenemos ciertas funciones que nos parsean los datos de la forma que nos conviene y que llaman al nuestro "charging" script con los parámetros necesarios, y que sera el que se encargará de hacer las búsquedas correctas y su posterior caching, estas funciónes estan agrupadas, es decir, que existirá una sola función para la política "extensión y ruta" y "ruta y extensión"

Por otro lado también hemos tenido que adaptar nuestro "charging script" a estas modificaciones, ya que nuestra forma de trabajar ha cambiado de forma considerable, principalmente respecto a la función de búsqueda de ficheros acorde con la política. Hemos conseguido hacer tan solo un par de llamadas al comando find en vez de hacer una llamada por cada tipo de politica, cosa que nos produciría también alrededor de 80 o 90 llamadas al comando find, y esto lo hemos resuelto comprobando a través de un identificador de política el tipo de política y haciendo que los parametros que forman parte del comando fueran variables, a parte de las variables valores que necesitamos buscar.

Un ejemplo seria que al hacer una búsqueda por tamaño nuestro comando seria algo como find -size -"tamaño_introducido".

Pero lo que hacemos es que -size sea una variable $size, y que dependiendo el identificador de política su valor sea "-size" o nulo "".

sábado, 10 de octubre de 2009

Creando un log

Debido a que nuestro shell script "charging" se ejecuta al ser llamado por nuestro awk "lee_conf.awk", este será ejecutado y cerrado tantas veces como políticas correctas existan en el fichero de configuración. Esto supone un problema, ya que deberemos guardar datos de ejecuciones anteriores, para las nuevas ejecuciones de nuestro shell script. Actualmente el dato que necesitamos guardar es el espacio libre en cache después de cachear los diferentes archivos, una forma guardar este valor es hacerlo en un fichero. Ya que tenemos que generar este fichero de texto con este dato, es una buena opción aprovecharlo para hacer un log de la ejecución de nuestro programa, así que a parte de escribir y leer datos en él para su posterior uso, introduciremos datos que resultarán útiles de cara al usuario final.
Los datos que inicialmente hemos decidido introducir son:
Espacio libre inicial en cache (Lo usaremos en nuestro script).
Número de política aplicada.
Ficheros cacheados en cada politica.
Total tamaño de ficheros cacheados para cada política.
Espacio libre en cache después de cachear todos los ficheros de todas las políticas aplicadas.

Añadiendo Loglevel

Hemos añadido a nuestro shell script "charging" una variable llamado loglevel. Esta variable podrá tener valores del 1 al 4, donde 1 representará un bajo nivel de loglevel, y el 4 el mas alto nivel de loglevel.

El loglevel nos servirá para especificar el nivel de salidas por pantalla queremos en nuestro programa, es decir especificando un 4, en la salida por pantalla de nuestro programa mostrará todos los mensajes del programa y que esta haciendo en todo momento, en cambio si especificamos un 1, nuestro programa mostrará el mínimo de mensajes por pantalla mientras se ejecute, y solo mostrará los eventos mas importantes, como cuando se haya ocupado el tamaño máximo de cache y no se pueda seguir cacheando. Para realizar esto hemos añadido condicionales a cada uno de los "printf" y "echo" que salian por pantalla, y dependiendo el grado de importancia que creemos que tienen se ejecutarán si su loglevel cumple la condición de ser igual o mas grande que el loglevel especificado en la variable inicial.

Fallo en crontab

Tal y como comentábamos en el anterior post, la tarea crontab no se ejecutaba de forma correcta, después de hacer diferentes búsquedas, comprobar variables de entorno, etc, creamos un log con la ejecucion de la tarea desde crontab, y nos muestra donde estaba nuestro error, la instrucción que llama a nuestro shell script dentro del código de awk no tenia el path especificado, y no encontraba el fichero, con esto solucionado la tarea se ejecuta correctamente.

Ahora nos faltará solucionar otro problema, en caso que el usuario desee introducir algún asterisco en alguno de los cinco parámetros del momento de ejecución de la tarea, nuestro script no entiende el asterisco como un literal, sino como una expresión regular, una posible solución seria comprobar si los parámetros son asteriscos y modificarlos por rangos 0-59, etc.

Aparcamos este problema de momento, ya que creemos que esa solución deberia funcionar, y lo retomaremos en su momento.

martes, 6 de octubre de 2009

Modificaciones en fichero de configuración(3) Asignando periocidad a crontab

También vamos a modificar nuestro fichero de configuración para que el usuario pueda asignar la tarea de ejecutar nuestro programa con la periocidad que el elija.

Utilizamos la misma nomenclatura que crontab.

crontab=* * * * *

Lo leemos con nuestro fichero lee_conf.awk y asignamos a las variables correspondientes.

Actualmente no tenemos esta parte funcionando correctamente, ya que tenemos un problema a la hora de ejecutar el programa awk con crontab, estamos consultando en los foros en busca del posible problema y solución.

Una vez solucionado nuestro programa realizará correctamente la tarea programada, y solo nos faltará depurar un poco mas nuestro fichero de configuración y el programa para su lectura.

Modificaciones en fichero de configuración(2) Asignado tamaño de la cache

De nuevo vamos a realizar modificaciones en nuestro fichero de configuración, esta vez el usuario podrá especificar en tal fichero si desea asignar un tamaño fijo de cache en vez de usar el espacio libre en disco.
Encontraremos una entrada del estilo: cache_size=1000M
El usuario debera especificar un número y una unidad de tamaño, nuestro programa de lectura de configuración encontrará esta entrada y trabajara con ella para enviar los datos necesarios a nuestro script "charging" que será el que se dedique a realizar todas las acciones necesarias para el caching.

Debido a estas modificaciones, hemos tenido que adecuar nuestro programa de caching "charging" para que contemplará la comentada doble posibilidad, que el tamaño de la cache fuera la asignada por el usuario o que sea el espacio en libre en disco. Nuestro script comprobará si el fichero de lectura de configuración le pasa las variables correspondientes al tamaño de la cache, en caso de que no se pasen trabajará con el tamaño libre en disco