Compreendendo inotifywait, pipes e buffers

3

Eu quero monitorar todas as alterações de arquivo em um diretório com inotifywait . inotifywait deve gravar em um buffer FIFO, que então pode ser lido, sem pressa. Enquanto experimentava quantidades relativamente grandes de eventos, encontrei alguns gargalos, o que eu gostaria de entender.

As alterações são sempre causadas por touch {0000..9999}testfile . Os afunilamentos estão na forma de não capturar todos os eventos de arquivo.

Quando eu redireciono a saída de inotifywait para um arquivo, tudo fica registrado como deveria.

inotifywait -q -m ./ escrevendo no Terminal captura CREATE, OPEN, ATTRIB, CLOSE por cerca de 5000 a 8000 arquivos. Eu acho que o "escrever na tela" não é rápido o suficiente para ser não-bloqueante?

Se eu canalizar para cat ( inotifywait... | cat | ... | cat ), eu finalmente obtenho todos eles, em algum momento. Então eu acho que os canais estão meio que em buffer, mas eu realmente não entendo como isso funciona, ou até mesmo o que procurar. Alguém poderia, por favor, explicar isso?

Eu também joguei com uma "solução" que encontrei aqui. Usando pv -q -B 1g como buffer (também buffer ).

inotifywait -q -m ./ | BUFFER | \
while read line; do
   # Do something with $line or ...
   sleep 1
done

Como pode garantir que todos os eventos de arquivo possam ser processados? Tenho a sensação de que minha pequena peça sobre o voodoo bash encontrou algumas restrições mais profundas, nas quais gostaria de ter mais informações.

    
por Igor Karoshi 12.10.2015 / 00:01

0 respostas