inotify: acciones disparadas por cambios en el sistema de ficheros

Python

Esta receta explica cómo incorporar a tus programas la posibilidad de realizar acciones cuando se crean, borran, cambian, etc. ficheros o directorios concretos.

Ingredientes

  • python-pyinotify
  • inotify-tools

Introducción

inotify es un servicio de Linux (el kernel, ¿qué si no?) que simplifica enormemente la monitorización de cambios en el sistema de ficheros. Se trata de una implementación casi «de libro» del patrón observador.

Los pasos son sencillos, se define lo que se quiere observar (el observable) que será uno o más ficheros o directorios, bajo qué condiciones debe notificarse y quién recibirá esas notificaciones (los observadores) que normalmente ocurre como una invocación a una función o método.

Un ejemplo sencillo con pyinotify

pyinotify es un binding de python para inotify, aunque como es lógico los hay para muchos otros lenguajes. El siguiente ejemplo simplemente imprime el evento ocurrido y la ruta del fichero que lo ha sufrido:

[ notify.py ]

import sys
import pyinotify as inotify
 
class EventHandler(inotify.ProcessEvent):
    def process_IN_CREATE(self, event):
        print "Create:", event.pathname
 
    def process_IN_DELETE(self, event):
        print "Delete:", event.pathname
 
    def process_IN_MODIFY(self, event):
        print "Modify:", event.pathname
 
wm = inotify.WatchManager()
wm.add_watch(sys.argv[1],
             inotify.IN_MODIFY | inotify.IN_CREATE | inotify.IN_DELETE, rec=True)
 
notifier = inotify.Notifier(wm, EventHandler())
notifier.loop()

Debes pasarle el nombre de un fichero o directorio como primer argumento. Y eso es todo, así de sencillo.

En la página web de pyinotify puedes encontrar un tutorial bastante sencillo y algunos ejemplos más sofisticados

inotify desde consola

El comando inotifywait del paquete inotify-tools permite disparar comandos de un modo muy sencillo. El siguiente comando (candidato a alias) ejecuta make cada vez que cambia alguno de los ficheros del directorio.

$ make; while inotifywait -r -e MODIFY .; do make; done;

Puede ser muy útil para tener una consola en la que puedes ver errores sintácticos del programa que estás editando, o mantener compilado un documento LaTeX que tienes abierto con evince (u okular), aprovechando que estos programas también actualizan el documento .pdf cuando cambia.

incron

incron es un servicio (incrond) similar al clásico «cron» pero en el que se definen las acciones en base a eventos del sistema de ficheros en lugar de eventos temporales. También dispone de un comando incrontab similar a crontab para que los usuarios puedan añadir sus propios eventos.

Resulta muy útil para labores de gestión o monitorización: enviar un email cuando se añade o modifica cierto fichero, reiniciar (o recargar) un servicio cuando cambia su fichero de configuración, etc.

Referencias