在中断之前强制 ping 写入

在中断之前强制 ping 写入

我试图让 ping 连续写入文件几次。当我跑步时

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

它每几毫秒返回一个数字:

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

但是,当我将其重定向到一个文件,并将tail -f该文件重定向到其他地方时,什么也没有发生。当我按下 Ctrl-C 时,没有任何内容写入文件。

当新数据传入时,如何强制 ping 写入 STDOUT?

答案1

您会遭受管道缓冲的困扰。通常,非交互式终端的输出会缓冲到 4Kb 块,直到通过管道传送,因此您必须禁用它。

你可以像这样改变你的命令行:

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

stdbuf是 coreutils 的一部分。

$|=1;是去的方法在 perl 中禁用输出缓冲

PD 我已经删除了 ping 命令中多余的“10”。

相关内容