Joh*_*ine 2 bash shell perl diamond-operator
即使这个问题听起来很烦人,但我仍然坚持这一点.所描述的问题发生在Ubuntu 14.04和CentOS 6.3.
我正在使用一个perl脚本netbps,在答案中发布了一个名为RedGrittyBrick:by 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
shell /控制台上生成的输出如下所示:
13:52:09 47.86 Bps
13:52:20 517.54 Bps
13:52:30 222.59 Bps
13:52:41 4111.77 Bps
Run Code Online (Sandbox Code Playgroud)
我试图将此输出捕获到文件,但是,我无法这样做.我尝试过以下方法:
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文件.shell /控制台上没有输出.
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl 2>&1 | grep "Bps"
shell /控制台上没有输出.
我对perl知之甚少,但在我看来这似乎是一个缓冲问题 - 虽然不确定?任何帮助将不胜感激.
这是一个缓冲问题.将该行添加STDOUT->autoflush(1)到netbps,它将起作用.
STDOUT通常是行缓冲,所以结尾处的换行符printf应该触发缓冲区刷新,但因为它被重定向到文件,所以它像任何普通文件一样被缓冲.你可以看到...
$ perl -e 'while(1) { print "foo\n"; sleep 5; }'
Run Code Online (Sandbox Code Playgroud)
VS
$ perl -e 'while(1) { print "foo\n"; sleep 5; }' > test.out
Run Code Online (Sandbox Code Playgroud)