Por que o inotifywatch não detecta mudanças nos arquivos adicionados?

13

Estou tentando monitorar minha pasta /tmp para alterações usando inotifywatch :

sudo inotifywatch -v -r /tmp

Depois de criar alguns arquivos ( touch /tmp/test-1 /tmp/test-2 ), estou terminando inotifywatch (por Ctrl - C que mostra as seguintes estatísticas:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

A saída só imprime as estatísticas, mas não os arquivos que eu esperava (como em aqui ou aqui . Eu tentei diferentes tipos de acesso (via cat , mktemp , etc.), mas é a mesma coisa.

Eu senti falta de algo? É porque estou no VPS e algo foi restrito?

SO: Debian 7.3 (inotify-tools) no VPS

    
por kenorb 29.10.2014 / 13:23

1 resposta

13

Isso se deve à maneira como você está usando inotifywatch e à maneira como a própria ferramenta funciona. Quando você executa inotifywatch -r /tmp , começa a assistir /tmp e todos os arquivos contidos nele. Quando você cria um arquivo dentro de /tmp , os metadados do diretório são atualizados para conter o novo número de inode do arquivo, o que significa que a alteração acontece em /tmp , não /tmp/test-1 . Além disso, como /tmp/test-1 não estava presente quando inotifywatch começou, não há inotify watch 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 ver:

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

Se você tiver ativado o mecanismo de rastreamento em inotify_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 em si. Agora, crie um arquivo dentro de /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 aumentará, 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 a opção -r se comporta :

-r, --recursive: [...] If new directories are created within watched directories they will automatically be watched.

Edit: Eu fiquei um pouco confuso entre seus dois exemplos, mas no primeiro caso , os relógios são colocados corretamente porque o usuário chama inotifywatch on ~/* (que é expandido, veja o comentário de don_crissti aqui ). O diretório inicial também é visto porque ~/.* contém ~/. . Teoricamente, ele também deve conter ~/.. , que, combinado com a opção -r , deve resultar na observação de todo o sistema.

No entanto, é possível obter o nome do arquivo que aciona um evento create em um diretório monitorado, mas acredito que inotifywatch não recupere esse informações (é salvo um pouco mais do que o nome do diretório). inotify-tools fornece outra ferramenta, chamada inotifywait , que pode se comportar como inotify-watch e fornece mais opções de saída (incluindo %f , que é o que você está procurando aqui):

inotifywait -m --format "%e %f" /tmp

De a página do manual :

--format <fmt> Output in a user-specified format, using printf-like syntax. [...] The following conversions are supported:

%f: when an event occurs within a directory, this will be replaced with the name of the file which caused the event to occur.

%e: replaced with the Event(s) which occurred, comma-separated.

Além disso, a opção -m (monitor) manterá inotifywait em execução após o primeiro evento, o que reproduzirá um comportamento bastante semelhante ao inotifywatch 's.

    
por 29.10.2014 / 14:05