Execute o comando após os relógios estabelecidos inotifywait

5

Dentro do script de shell ( test.sh ) Eu tenho inotifywait monitorando recursivamente algum direcotry - "somedir":

#!/bin/sh
inotifywait -r -m -e close_write "somedir" | while read f; do echo "$f hi"; done

Quando eu executo isso no terminal, recebo a seguinte mensagem:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

O que eu preciso é tocar em todos os arquivos em "somedir" DEPOIS os relógios foram estabelecidos. Para isso eu uso:

find "somedir" -type f -exec touch {}

A razão é que ao iniciar o inotifywait após o travamento, todos os arquivos que chegam durante o tempo nunca serão coletados. Então, o problema e a pergunta é, como ou quando devo executar o find + touch ?

Até agora tentei dormir alguns segundos depois de chamar test.sh , mas isso não funciona a longo prazo quando o número de subdiretores em "somedir" crescer.

Eu tentei verificar se o processo está em execução e durmo até que apareça, mas parece que o processo aparece antes de todos os relógios serem estabelecidos.

Eu tentei alterar test.sh :

#!/bin/sh
inotifywait -r -m -e close_write "somedir" && find "somedir" -type f -exec touch {} | 
while read f; do echo "$f hi"; done

Mas nenhum arquivo é tocado. Então eu realmente preciso de uma ajuda ...

Informações adicionais são de que test.sh está sendo executado em segundo plano: nohup test.sh &

Alguma ideia? Obrigado

FYI: Baseado no conselho do @xae, eu uso assim:

nohup test.sh > /my.log 2>&1 &
while :; do (cat /my.log | grep "Watches established" > /dev/null) && break; done;
find "somedir" -type f -exec touch {} \+
    
por lp1051 31.01.2015 / 17:45

2 respostas

5

Quando inotifywait exibe a string " Relógios estabelecidos. " é seguro fazer alterações nos inodes assistidos, então você deve esperar até que a string apareça no erro padrão antes de tocar nos arquivos. / p>

Como exemplo, esse código deve para isso,

inotifywait -r -m -e close_write "somedir" \
2> >(while :;do read f; [ "$f" == "Watches established." ] && break;done;\
find "somedir" -type f -exec touch {} ";")\
| while read f; do echo "$f hi";done
    
por 01.02.2015 / 12:52
0

'inotifywait -m' faz com que seja executado indefinidamente. Ele deve ser morto, 'somedir' rm-r'ed ou fs de 'somedir' desmembrado para obter status de saída.

'find' nunca será executado até que 'inotifywait' saia 0.

Este pode ajudar;

inotifywait -r -d -o > (tee / absolute / caminho / para / arquivo | grep 'algo' & & achado 'somedir') 'somedir' ou

inotifywait -r -d -o / absolute / caminho / para / arquivo 'somedir'

grep 'somthing' / absolute / path / para / file & & encontrar 'somedir'.

'- d' modo daemon, -m + executado em segundo plano.

    
por 01.02.2015 / 07:40