enchufado
   RSS
#
Control de cambios en los ficheros de un directorio (Programación) 2011-09-06 15:30:58

Este post surge a raíz de un post vertido en Linkedin en la que se habla de cómo crear un demonio para el control de los ficheros de un directorio, así que lo dejo aquí plasmado para la posteridad.

En realidad, el post acaba dejando de lado la idea de escribir un demonio para esto, y hace un script en Bash cuyo bucle while ni siquiera tiene un sleep o algo para parar la contínua avalancha en ejecución que esto puede suponer para la pobre CPU que se tope con él.

¿Hay un modo más eficiente de hacer esto? Como no habría post sin afirmación, la respuesta es sí. Y viene de mano de los "filesystem event monitors" (monitorizadores de eventos del sistema de ficheros). Inotify, que es una API para GNU/Linux que proporciona un mecanismo para esto, es uno de ellos. Como podemos ver en un artículo de IBM, es la evolución de dnotify. Vamos a usarlo.

Pasos:

  1. Primero lo instalamos (observemos que en Debian han sustituido la librería pynotify por inotifyx por varios motivos como rendimiento o estabilidad de la API): apt-get install python-inotifyx
  2. Desde la consola interactiva de python, podemos ver un ejemplo de uso escribiendo import inotifyx y help(inotifyx).
  3. Pongamos en práctica el ejemplo:
  4. #!/usr/bin/python
    import os
    import inotifyx
    
    fd = inotifyx.init()
    try:
     wd = inotifyx.add_watch(fd, '/home/usuario', inotifyx.IN_ALL_EVENTS)
     events = inotifyx.get_events(fd)
     print ''
     print 'events: ' + `events`
     print '--------------------'
     for event in events:
      print 'event.mask: ' + `event.mask`
      print 'event.get_mask_description(): ' + event.get_mask_description()
      print '--------------------'
     inotifyx.rm_watch(fd, wd)
    finally:
     os.close(fd)
    
  5. Lo ejecutamos, realizamos cualquier operación de cambio de un fichero en el directorio monitorizado y veremos que el script nos avisa de dicha operación.

Para la monitorización contínua, sólo quedaría ponerla en un bucle para que no se parara al primer evento detectado y listos. ¿A alguien se le ocurre una idea mejor?


Comentarios (0)


Volver al indice

login, admin, form, register