我试图让 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”。