Força o ping a escrever antes da interrupção

0

Estou tentando fazer o ping escrever continuamente algumas vezes em um arquivo. Quando eu corro

 $ ping 10 10.1.10.28 | perl -ne '/time=(\d+\.\d+)/ && print "$1\n"'

Retorna um número a cada vários milissegundos:

$ ping 10 10.1.10.28  | perl -ne '/time=(\d+\.\d+)/ && print "$1\n"'
191.523
312.225
127.506

No entanto, quando eu redirecionar isso para um arquivo, e tail -f desse arquivo em outro lugar, nada acontece. Quando eu clico em Ctrl-C, nada é gravado no arquivo.

Como posso forçar o ping a gravar no STDOUT quando novos dados chegam?

    
por tlehman 05.12.2014 / 23:44

1 resposta

1

Você sofre de buffer de tubo. Normalmente, a saída para o terminal não interativo é armazenada em buffer para blocos de 4Kb até que seja entregue via pipe, portanto, é necessário desativá-lo.

Você pode alterar sua linha de comando assim:

$ stdbuf -oL ping 10.1.10.28  | perl -ne '$|=1; /time=(\d+\.\d+)/ && print "$1\n"' > file

stdbuf é parte do coreutils.

$|=1; é o caminho para desativar o buffer de saída no perl .

P.D. Eu removi o "10" extra no comando ping.

    
por 08.12.2014 / 10:23