Tenho um programa que para cada execução gera um novo arquivo de log. Para ver o que está acontecendo, gostaria de ver tail -f
o log - o único problema é que não sei o nome do arquivo com antecedência.
Então, existe uma maneira de seguir todos os arquivos que correspondem a um determinado padrão (shell glob)? Acho que poderia facilmente criar algo assim, mas estou me perguntando se já existe uma solução por aí.
Responder1
Eu não acho que exista uma maneira direta de fazer isso tail
sem saber o nome - se você soubesse disso, tail --follow=name --retry
funcionaria e esperaria o arquivo aparecer e então começaria a segui-lo.
Eu sugiro escrever um pequeno script de shell que inotifywait
observe o arquivo aparecer e então comece tail -f
a segui-lo.
Responder2
Se você não souber o nome do arquivo com antecedência:
- decida um nome de arquivo, como
foo.log
- observe esse arquivo:
tail -F foo.log
(não importa se foo existe ou não) - use uma ferramenta para observar o diretório em busca de alterações de arquivo e execute um comando
Para o comando:
- mova o novo arquivo para substituir foo.log
mv the_new_file_which_appeared foo.log
(se o log do aplicativo abrir uma vez, isso funcionará bem) - ou apenas link simbólico:
ln -s the_new_file_which_appeared foo.log
- e tail deve capturar isso.
Para monitorar adequadamente os diretórios (etapa 3), você precisa de uma ferramenta inteligente e configurável.
Pessoalmente, eu usariaGuardacom oGuarda::Processo.
Na prática, o Guard não é muito mais pesado do que usar shell scripts (é uma camada fina sobre o inotify no Linux) e é muito rápido e fácil de configurar.