Estou tentando obter um sistema funcional para monitorar logs especiais. Normalmente, eu só quero um padrão muito específico do qual extraio usando grep
um pipe tail -f
. Percebi que o grep não produz tudo, mas mantém algumas linhas em buffer. Acho que faz sentido se você tiver um canal que produza tudo e, em seguida, encerre e feche o fluxo.
Mas com tail -f
isso não funciona para mim.
O mesmo problema aparece com sed
.
Aqui está um exemplo de comando que desejo usar:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'
Para fornecer um exemplo:
A última linha do comando acima é esta:
2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x
E usando este comando:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g
A última linha é esta:
2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y
A remoção de outros pipes me leva às entradas mais recentes.
Como posso evitar esse cache nos pipes?
Responder1
Adicionar grep
opção --line-buffered
e sed
opção --unbuffered
.
Responder2
Use a opção grep
de --line-buffered
.
Por padrão, os utilitários usam buffer de linha se sua saída padrão for um terminal, mas usam buffers maiores (provavelmente 4 ou 8 kB) quando sua saída está conectada a um descritor de arquivo ou canal.
Você tem sorte de tail -F
usar buffer de linha por padrão e grep
ter uma opção de linha de comando para ativar isso. Não conheço um método genérico para ativar o buffer de linha para um comando arbitrário.