尽管这个问题听起来很愚蠢,但我仍然坚持。所述问题同时出现在Ubuntu 14.04
和上CentOS 6.3
。
我正在使用一个Perl脚本netbps
,该脚本在答案中(由RedGrittyBrick
)发布:https : //superuser.com/questions/356907/how-to-get-real-time-network-statistics-in-linux-with-kb- mb字节格式和
上面的脚本基本上采用tcpdump的输出(该命令的详细信息在这里我们不需要知道),并以不同的格式表示它。请注意,脚本在流模式下执行此操作(即,输出是即时生成的)。
因此,我的命令如下所示:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl
在外壳/控制台上产生的输出如下所示:
13:52:09 47.86 Bps
13:52:20 517.54 Bps
13:52:30 222.59 Bps
13:52:41 4111.77 Bps
我正在尝试将此输出捕获到文件中,但是,我无法这样做。我尝试了以下方法:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl > out.out 2>&1
这将创建一个空out.out
文件。没有输出出现在外壳/控制台上。
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl 2>&1 | grep "Bps"
没有输出出现在外壳/控制台上。
我对perl不太了解,但是在我看来,这就像一个缓冲问题-不确定吗?任何帮助将不胜感激。
这是一个缓冲问题。将行添加STDOUT->autoflush(1)
到netbps,它将起作用。
STDOUT
通常是行缓冲的,因此末尾的换行符printf
将触发缓冲区刷新,但是由于它被重定向到文件,因此它像任何普通文件一样被缓冲。你可以看到...
$ perl -e 'while(1) { print "foo\n"; sleep 5; }'
与
$ perl -e 'while(1) { print "foo\n"; sleep 5; }' > test.out
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句