Eu uso isso para verificar as linhas de log de um arquivo de log até a ocorrência de um evento específico (retirado desta resposta para Monitorando um arquivo até que uma string seja encontrada ):
(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'
Isso funciona, mas também quero que as linhas de log sejam impressas em stdout enquanto aguardo o evento. Estou procurando algo como tee
, mas quero imprimir e canalizar ao mesmo tempo.
Eu tentei esta resposta para Pipe e observei a saída canalizada? , levando a:
(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'
mas o comando nunca é encerrado, presumivelmente porque grep
falha ao interromper tail
quando encontra uma correspondência, tail
continuando a fornecer dados para tee
?
Após
grep
as saídas, vocêtee
sairá devido ao SIGPIPE somente quando tentar escrever mais no pipe. É assim que os tubos funcionam. Isso significa que você precisa de mais uma linha detail
.tee
sairá eventualmente , a menos quetail
fique para sempre em silêncio após a impressãoSPEFICIC LOG MESSAGE
.tail … | grep …
é semelhante em geral. O truque com(tail … &)
faz com que seu shell principal não esperetail
(ele espera pelo subshell e o subshell não esperatail
graças a&
).Você pode usar o mesmo truque com
tee
:O shell principal aguardará os dois subshells e
grep
. Os subshells sairão quase imediatamente, então égrep
o que importa. Quandogrep
sair, o shell principal continuará.tee
ficará em segundo plano até tentar escrever mais. Só então pega o SIGPIPE e sai. Isso requer uma linha extra do log.Por sua vez
tail
ficará em segundo plano até que tente escrever mais apóstee
sair. Isso requer outra linha extra do log. A menos que vocêtail
seja inteligente . O GNUtail
detecta canos quebrados imediatamente, não requer o truque. Usar o truque com o GNUtail
é inofensivo, portanto, em caso de dúvida, use-o.tee
não é tão inteligente, requer o truque.O comando que dei a você deve funcionar, mas lembre-se
tee
etail
ficará em segundo plano até que a próxima linha apareça no log. Se sua cauda não for inteligente, ela permanecerá por mais uma linha.