Isso se deve à maneira como você está usando inotifywatch
e à maneira como a própria ferramenta funciona. Quando você executa inotifywatch -r /tmp
, você começa a assistir /tmp
e todos os arquivos que já estão nele. Quando você cria um arquivo dentro /tmp
, os metadados do diretório são atualizados para conter o número do inode do novo arquivo, o que significa que a alteração ocorre /tmp
, não /tmp/test-1
. Além disso, como /tmp/test-1
não estava lá quando inotifywatch
iniciado, não há inotify
relógio colocado nele. Isso significa que qualquer evento que ocorra em um arquivo criado após a colocação dos relógios não será detectado . Você pode entender melhor se você mesmo:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Se você ativou o mecanismo de rastreamentoinotify_add_watch(2)
, o último comando fornecerá o número de relógios configurados por inotifywatch
. Esse número deve ser o mesmo que o dado por inotifywatch
si só. Agora, crie um arquivo dentro /tmp
e verifique novamente:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
O número não aumentou, o que significa que o novo arquivo não é assistido. Observe que o comportamento é diferente se você criar um diretório:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Isso se deve à maneira como o -r
switch se comporta :
-r
, --recursive
: [...] Se novos diretórios forem criados nos diretórios monitorados, eles serão monitorados automaticamente.
Edit: Eu tenho um pouco confuso entre os dois exemplos, mas no primeiro caso , os relógios estão correctamente colocados porque as chamadas de usuários inotifywatch
em ~/*
(que é expandido, ver o comentário de don_crissti aqui ). O diretório inicial também é monitorado porque ~/.*
contém ~/.
. Teoricamente, ele também deve conter o ~/..
que, combinado com a -r
chave, deve resultar na observação de todo o sistema.
No entanto, é possível obter o nome do arquivo acionando um evento de criação em um diretório monitorado, mas acho inotifywatch
que não recupera essas informações (elas são salvas um pouco mais profundas que o nome do diretório). inotify-tools
fornece outra ferramenta, chamada inotifywait
, que pode se comportar de maneira semelhante inotify-watch
, e fornece mais opções de saída (incluindo o %f
que você está procurando aqui):
inotifywait -m --format "%e %f" /tmp
Na página do manual :
--format <fmt>
Saída em um formato especificado pelo usuário, usando a sintaxe do tipo printf. [...] As seguintes conversões são suportadas:
%f
: quando um evento ocorrer em um diretório, ele será substituído pelo nome do arquivo que causou a ocorrência do evento .
%e
: substituído pelo (s) evento (s) que ocorreram, separados por vírgula.
Além disso, a -m
opção (monitor) continuará inotifywait
sendo executada após o primeiro evento, o que reproduzirá um comportamento bastante semelhante ao inotifywatch
.
.bashrc
no exemplo @serverfault
não aparece nas estatísticas porque o usuário monitora seu diretório inicial recursivamente, mas porquepath/.*
é expandido e, como resultado, um monitoramento é definido para todos os arquivos empath/
(.bashrc
incluído). O comando usado pelo OP nunca produzirá nomes de arquivos porque os relógios estão definidos/tmp
e quaisquer subdiretórios, portanto, as estatísticas pertencem apenas a/tmp
seus subdiretórios (por exemplo, você verá que os arquivos foram acessados / movidos / etc), mas não informará seus nomes)./tmp
:inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
.inotifywatch
saída na pergunta OP: os 2create
eventos estão lá (portanto, são detectados), mas comoinotifywatch
observa um diretório (+ quaisquer subdiretórios), as estatísticas pertencem apenas a esses / esses diretórios.man inotify
:When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.
Além disso,man inotifywatch
é claro sobre quais eventos estão sendo observados:EVENTS
>> ... Um arquivo monitorado ou em um diretório monitorado foi acessado / fechado / aberto / etc (significa incluir eventos "que ocorrem em um arquivo" ). Os eventos para um arquivo criado após definir a inspeção no diretório pai SERÃO detectados e refletidos nasinotifywatch
estatísticas (NÃO mencionará para quais arquivos esses eventos ocorreram).