2012-01-02 6 views
25

¿Cómo puedo controlar un árbol de directorios completo para ver los cambios en Linux (ext3 sistema de archivos)?cómo monitorear un árbol de directorios completo para cambios en Linux?

Actualmente el directorio contiene aproximadamente medio millón de archivos en unos 3.000 subdirectorios, organizados en tres niveles de directorio.

Esos son en su mayoría pequeños archivos (< 1 kb, algunos pocos hasta 100 kb). Es una especie de cola y necesito saber cuándo se crean, eliminan o se modifican los contenidos dentro de 5-10 segundos de que eso ocurra.

sé que no es inotify y tipo, pero que yo sepa que sólo supervisar un solo directorio, lo que significa que necesitaría 3.000 mangos inotify en mi caso - más de los habituales 1.024 mangos permitidos para un solo proceso. ¿O estoy equivocado?

En caso de que el sistema Linux no pueda decirme lo que necesito: quizás haya un proyecto FUSE que simule un sistema de archivos (replicando todos los accesos a archivos en un sistema de archivos real) y registra por separado todas las modificaciones (no podría bien uno)?

Respuesta

12

Que yo sepa, no hay otra manera que establecer recursivamente un reloj inotify en cada directorio.

Dicho esto, no se agotarán los descriptores de archivos porque inotify no tiene que reservar un fd para ver un archivo o un directorio (su predecesor, dnotify, sufría esta limitación). inotify usa "descripciones de reloj" en su lugar.

De acuerdo con la documentación para inotifywatch, el límite predeterminado es 8192 descripciones de reloj, y puede aumentarlo escribiendo el nuevo valor en /proc/sys/fs/inotify/max_user_watches.

+0

suena bien. ¿Tiene aspectos negativos que considerar al usar tantos descriptores de reloj? –

+0

No, aparte del tiempo necesario para crear todos los relojes, no creo que te encuentres con problemas con solo 3000 subdirectorios. –

3

No fue fanotify supone para proporcionar esa capacidad con el tiempo? Citando LWN:

"fanotify tiene dos 'modos' básicos dirigidos y globales. [...] fanotify global en vez indica que quiere todo en el sistema y luego marca individual i-nodos que no le interesan.

Perdí la cuenta cuál era su estado más reciente, sin embargo.

+1

De acuerdo con un comentario en contra de http://stackoverflow.com/a/1847268/130352 ... el fanotify entró en 2.6.36. –

28

que he hecho algo similar con la función inotifywait:

#!/bin/bash 
while true; do 

inotifywait -e modify,create,delete -r /path/to/your/dir && \ 
<some command to execute when a file event is recorded> 

done 

directorio recursivo esta configuración, se observa en todo el árbol y le permiten ejecutar un comando cuando algo cambia. Si lo que desea es ver los cambios, puede agregar la opción -m para ponerlo en modo monitor.

+1

Esto es más útil que la respuesta aceptada, +1 – qed

+2

Para evitar el 'while loop' use el modificador' -m' o '--monitor'/option/flag/arg. No sé cuándo se creó ese 'interruptor', pero es mejor que los bucles – gwillie

+0

También debe agregar el evento 'mover': 'inotifywait -e modificar, crear, eliminar, mover -r/ruta/a/su/dir' – famzah

3
$ inotifywait -m -r /path/to/your/directory 

Este comando es suficiente para ver el directorio de forma recursiva para todos los eventos, tales como el acceso, abierto, crear, eliminar ...

Cuestiones relacionadas