Esto se debe a la forma en que está utilizando inotifywatchy a la forma en que funciona la herramienta. Cuando corres inotifywatch -r /tmp, comienzas a mirar /tmpy todos los archivos que ya están en él. Cuando crea un archivo en el interior /tmp, los metadatos del directorio se actualizan para contener el número de inodo del nuevo archivo, lo que significa que el cambio ocurre /tmp, no /tmp/test-1. Además, dado que /tmp/test-1no estaba allí cuando inotifywatchcomenzó, no hay ningún inotifyreloj puesto en él. Significa que no se detectará ningún evento que ocurra en un archivo creado después de colocar los relojes . Puede entenderlo mejor si lo ve usted mismo:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Si ha activado el mecanismo de rastreoinotify_add_watch(2) , el último comando le dará la cantidad de relojes configurados por inotifywatch. Este número debe ser el mismo que el dado por inotifywatchsí mismo. Ahora, cree un archivo dentro /tmpy verifique nuevamente:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
El número no habrá aumentado, lo que significa que el nuevo archivo no se ve. Tenga en cuenta que el comportamiento es diferente si crea un directorio en su lugar:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Esto se debe a la forma en que -rse comporta el interruptor :
-r, --recursive: [...] Si se crean nuevos directorios dentro de directorios vigilados, se verán automáticamente.
Editar: Tengo un poco confundido entre sus dos ejemplos, pero en el primer caso , los relojes se colocan correctamente debido a las llamadas de los usuarios inotifywatchsobre ~/*(que se expande, ver el comentario de don_crissti aquí ). El directorio de inicio también se mira porque ~/.*contiene ~/.. Teóricamente, también debería contener ~/.., lo que, combinado con el -rinterruptor, debería dar como resultado la observación de todo el sistema.
Sin embargo, es posible obtener el nombre del archivo que desencadena un evento de creación en un directorio observado, pero supongo inotifywatchque no recupera esta información (se guarda un poco más profundo que el nombre del directorio). inotify-toolsproporciona otra herramienta, llamada inotifywait, que puede comportarse más o menos como inotify-watch, y proporciona más opciones de salida (incluido %f, que es lo que está buscando aquí):
inotifywait -m --format "%e %f" /tmp
Desde la página del manual :
--format <fmt>Salida en un formato especificado por el usuario, utilizando sintaxis similar a printf. [...] Se admiten las siguientes conversiones:
%f: cuando ocurre un evento dentro de un directorio, este será reemplazado con el nombre del archivo que causó el evento .
%e: reemplazado por los eventos que ocurrieron, separados por comas.
Además, la -mopción (monitor) seguirá inotifywaitejecutándose después del primer evento, lo que reproducirá un comportamiento bastante similar al de inotifywatch's.
.bashrcen el ejemplo, @serverfaultno aparece en las estadísticas porque el usuario monitorea su directorio de inicio de forma recursiva, sino porquepath/.*se expande y, como resultado, se establece un reloj para todos los archivos.path/(.bashrcincluidos). El comando utilizado por el OP nunca generará nombres de archivo porque los relojes están configurados/tmpy cualquier subdirectorio, por lo tanto, las estadísticas solo pertenecen a/tmpsus subdirectorios (es decir, verá que se ha accedido / movido / etc a los archivos, pero no le dirá su nombres)./tmp:inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.inotifywatchresultado en la pregunta de OP: los 2createeventos están allí (para que se detecten), pero comoinotifywatchobserva un directorio (+ cualquier subdirectorio), las estadísticas se refieren solo a ese / esos directorios.man inotify:When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.Además,man inotifywatchestá claro qué eventos se están viendo:EVENTS>> ... Se accedió / cerró / abrió un archivo mirado o un archivo dentro de un directorio mirado . etc (significa incluir eventos "que ocurren en un archivo" ). Los eventos para un archivo creado después de configurar el reloj en el directorio principal SERÁN detectados y reflejados en lasinotifywatchestadísticas (NO mencionará para qué archivos ocurrieron esos eventos).