Estou executando um daemon que processa arquivos em um diretório especÃfico. Eu quero processá-los um por um. então a idéia é copiar os arquivos 1 por 1 no diretório do daemon e seguir seu log, o segundo arquivo deve ser copiado para o diretório do daemon quando o arquivo de log terminar de ser processado primeiro, ou seja, o arquivo de log parar de atualizar.
como posso conseguir isso? dizer
daemon_dir=/var/daemon_dir/
daemon_log_file=/var/daemon/daemon_log
e eu tenho 5 arquivos para processar, ou seja, arquivo{1..5}
# ls -1
file1
file2
file3
file4
file5
então meu loop deve ir como está.
for file in file{1..5}
do
cp ${file} ${daemon_dir}
# daemon sees new file arriving in its dir, & starts processing
# log is tailed
tail -f ${daemon_log_file}
# when log file stops updating say for 1minute or specified time, tail quits
done
e o loop começa com o próximo arquivo.
Com
zsh
em vez debash
, você poderia fazer:(
zselect -t 100
dorme por 1 segundo. Comosleep 1
exceptzselect
é embutido.tail -f
normalmente também verifica novas entradas no arquivo a cada segundo (embora no Linux algumas implementações usem inotify em vez de detectar entrada de entrada)).Acima, usamos o qualificador glob
mm-1
(m
odified a menos de 1m
minuto atrás) para detectar quando o daemon terminou de processar o arquivo.Se no Linux, você pode monitorar o
IN_CLOSE_NOWRITE
evento inotify no arquivo, supondo que o daemon abra os arquivos de entrada apenas uma vez (e seja o único a abri-lo) e leve tempo suficiente para processar o arquivo, para que tenhamos tempo para configurar o relógioPara uma
tail -f
abordagem baseada, você poderia fazer (com zsh) algo como: