monitorización de directorios con inotify

Posted on Fri 01 April 2011 in misc • 3 min read

Hay veces que necesitamos que si en un determinado directorio, ocurre algo, por ejemplo, la creación de un archivo, poder desencadenar algún tipo de evento que haga algo con ese archivo.

Ya hace años que el kernel de linux tiene soporte para hacer estas cosas, antes con dnotify y ya actualmente con inotity.

Inotity es basicamente un subsistema del kernel de linux que notifica a las aplicaciones que lo implementen, de cambios en el estado del un directorio dado, bien sea porque se ha creado, borrado, modificado, etc algun fichero de ese directorio.

Para implementar inotify, bien puedes hacerte una aplicación usando libinotify o bien usan las muchas herramientas que hay ya hechas y que te facilitan el trabajo.

Me encargaron la tarea de que en un directorio dado, los usuarios iban a volcar archivos de audio y los tenia que convertir según llegaban lo mas rapido posible y moverlos a un volumen nfs, todo para un nuevo sistema de voz ip con asterisk que estamos montando.

Podria haber hecho un script con un bucle y un sleep, para monitorizar el directorio, pero me gusta hacer las cosas usando todo lo disponible en cualquier distro linux, asi que voy a usan una pequeñita aplicación llamada iwatch

vmalaga@lnxport:~$ sudo apt-get install iwatch

En el readme de la aplicacion tenemos un monton de ejemplos

vmalaga@lnxport:~$ dpkg -L iwatch|grep -i readme|xargs zmore

Lo primero que tenemos que hacer es editar el fichero de configuración de iwatch para decirle que directorio queremos monitorizar. En mi caso tengo de volumenes nfs montados y monitorizo uno, los audios, que son WAV, los tengo que procesar con sox para cambiar el codec para que use ulaw y pasarlo a otro volumen nfs diferente, ademas de enviar un correo.

vmalaga@lnxport:~$ sudo vi /etc/iwatch/iwatch.xml

En mi caso la configuración es muy sencilla, pero sirve perfectamente para lo que queremos:

<?xml version="1.0" ?> <!DOCTYPE config SYSTEM "/etc/iwatch/iwatch.dtd" >

<config> <guard email="root@localhost" name="IWatch"/> <watchlist> <title>Audios NICE</title> <contactpoint email="root@localhost" name="Administrator"/> <path type="single" alert="on" events="close_write" exec="sox -S %f -U /VOLOUT/basename %f" syslog="on">/VOLIN</path> </watchlist> </config>

Le estoy indicando a iwatch que monitorize /VOLIN los eventos close_write, que deje alerta en syslog y que ejecute el comando

sox -S /VOLIN/ficheroin.wav -U /VOLOUT/ficheroout.wav

He elejido en evento close_write, porque detecte que a veces no esperaba a terminar de escribir el fichero para lanzar el comando, ya que a veces son muy grandes, asi que espero el evento close_write, para lanzarlo.

Ademas nos envia un correo con la salida a quien indiquemos.

Para terminar, os aconsejo primero ejecutar en la consola iwatch antes de lanzarlo como daemon, para ver si todo va bien:

root@lnxport:/# iwatch -v -f /etc/iwatch/iwatch.xml Watch /VOLIN [ 1/Apr/2011 20:25:48] IN_CLOSE_WRITE /VOLIN/audio_1_D82.wav [ 1/Apr/2011 20:25:48] * /VOLIN/audio_1_D82.wav is closed [ 1/Apr/2011 20:25:48] * Command: sox -S /VOLIN/audio_1_D82.wav -U /VOLOUT/basename /VOLIN/audio_1_D82.wav

Input File     : '/VOLIN/audio_1_D82.wav' Channels       : 1 Sample Rate    : 8000 Precision      : 16-bit Duration       : 00:07:06.01 = 3408048 samples ~ 31950.4 CDDA sectors Sample Encoding: 16-bit Signed Integer PCM

In:100%  00:07:06.01 [00:00:00.00] Out:3.41M [!=====|=====!] Hd:0.0 Clip:0 Done. [ 1/Apr/2011 20:25:48] * Send email to root@localhost

Como veis en cuanto cierra el fichero el fichero, lanza el comando sox indicandole la entrada y la salida, usando el comando basename para quitar la parte de la ruta del fichero de entrada, ya que solamente necesito el nombre, no la ruta entera.

Ahora ya podeis levanta iwatch en modo daemon, primero tenemos que editar el fichero /etc/default/iwatch y cambiar la variable START_DAEMON=true

Ahora ya podeis levantar el daemon inotify:

root@lnxport:/# service iwatch start * Starting iwatch daemon iwatch  [ OK ]

Hasta la proxima