无法将 perl 脚本的输出重定向到文件
Unable to redirect output of a perl script to a file
尽管这个问题听起来很愚蠢,但我还是坚持了下来。 Ubuntu 14.04
和 CentOS 6.3
.
都会出现上述问题
我正在使用答案中发布的名为 netbps
的 perl 脚本(来自 RedGrittyBrick
):https://superuser.com/questions/356907/how-to-get-real-time-network-statistics-in-linux-with-kb-mb-bytes-format-and-for
上面的脚本基本上采用 tcpdump(我们不需要在这里了解其详细信息的命令)的输出并以不同的格式表示它。请注意,脚本在流模式下执行此操作(即,输出是动态生成的)。
因此,我的命令如下所示:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl
shell/console 上产生的输出如下所示:
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
文件。 shell/console 上没有输出。
- 管道和 grep:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl 2>&1 | grep "Bps"
shell/console 上没有输出。
我对 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
尽管这个问题听起来很愚蠢,但我还是坚持了下来。 Ubuntu 14.04
和 CentOS 6.3
.
我正在使用答案中发布的名为 netbps
的 perl 脚本(来自 RedGrittyBrick
):https://superuser.com/questions/356907/how-to-get-real-time-network-statistics-in-linux-with-kb-mb-bytes-format-and-for
上面的脚本基本上采用 tcpdump(我们不需要在这里了解其详细信息的命令)的输出并以不同的格式表示它。请注意,脚本在流模式下执行此操作(即,输出是动态生成的)。
因此,我的命令如下所示:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl
shell/console 上产生的输出如下所示:
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
文件。 shell/console 上没有输出。
- 管道和 grep:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl 2>&1 | grep "Bps"
shell/console 上没有输出。
我对 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