Libera 'tail -f' buffer?

6

Estou usando a seguinte declaração (versão simplificada):

tail -f -c+1 <filename>

para enviar um arquivo para um processo.

O que eu encontrei, porém, é que há um número de linhas no final que não são canalizadas.

Um exemplo específico é canalizar um arquivo mysql e parar quando o fim é alcançado:

tail -f -c+1 mysqdump.sql | sed '/^-- Dump completed/ q0'

Isso não funciona - a última linha do dump -- Dump completed [...] não é canalizada para o sed.

Meu palpite é que o buffer tail -f , nesse caso, é liberado apenas quando está cheio.

Alguém sabe como posso resolver isso?

=================

Eu encontrei a causa - a descrição não está completa (e o código não exibe o comportamento).

O problema acontece quando a tubulação de um arquivo compactado (lzma):

tail -f -c+1 <filename.lzma> | lzma -d | sed '/^-- Dump completed/ q0'

Provavelmente, tail não está enviando o último bloco compactado, porque não detecta nenhuma nova linha, pois a entrada é binária.

    
por Marcus 30.08.2012 / 15:02

2 respostas

9

tail -f é liberado após cada linha de entrada. Você pode confirmar isso com strace (ou truss ou qualquer que seja sua variante unix para rastrear as chamadas de sistema dos processos).

Se houver uma linha incompleta, tail -f continuará esperando pela próxima nova linha. É uma ferramenta projetada para arquivos de texto. Se você precisar seguir um arquivo binário (por exemplo, se -- Dump completed não for seguido por uma nova linha), será necessário usar uma ferramenta personalizada.

Se você redirecionou a saída de sed do terminal, ela estará fazendo seu próprio buffer. Tente stdbuf ou unbuffer .

    
por 31.08.2012 / 03:05
1

Exemplo usando stdbuf -o0 . Referência: link

tail -F cpu.log | stdbuf -o0 tr '=' ' ' | stdbuf -o0 awk '$6 > 1'
    
por 25.09.2018 / 15:43

Tags