Usando inotify para monitorar um diretório, mas não funcionando 100%

10

Eu escrevi um script bash para monitorar um diretório em particular /root/secondfolder/ :

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

Quando eu crio um arquivo chamado fourth.txt in /root/secondfolder/ e escrevo coisas nele, salve e feche, ele gera o seguinte:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

No entanto, não ecoa "close_write". Por que isso?

    
por mib1413456 04.07.2014 / 08:25

1 resposta

15

inotifywait -m é o modo "monitor" : ele nunca sai. O shell o executa e aguarda o código de saída para saber se deve executar o corpo do loop, mas isso nunca acontece.

Se você remover -m , funcionará:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

produz

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

Por padrão, inotifywait irá "sair após o primeiro evento ocorrer", que é o que você quer em uma condição de loop.

Em vez disso, você pode preferir ler a saída padrão de inotifywait :

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

Este script (bash) lerá cada linha de saída do comando inotifywait na variável $line dentro do loop, usando substituição de processos . Evita configurar os relógios recursivos todas as vezes em torno do loop, o que pode ser caro. Se você não puder usar o bash, poderá canalizar o comando para o loop: inotifywait ... | while read line ... . inotifywait produz uma linha de saída para cada evento nesse modo, então o loop é executado uma vez para cada.

    
por 04.07.2014 / 08:37