2015-10-25 82 views
1

即使这个问题听起来令人讨厌,但我坚持这一点。描述的问题发生在Ubuntu 14.04CentOS 6.3无法将perl脚本的输出重定向到文件

我使用所谓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

而且在外壳上产生的输出/控制台看起来是这样的:

13:52:09  47.86 Bps 
13:52:20  517.54 Bps 
13:52:30  222.59 Bps 
13:52:41 4111.77 Bps 

我想这个输出捕捉到文件,但是,我无法这样做。我曾尝试以下:

  1. 重定向到文件:

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 /控制台上不显示输出。

  • 管和grep:将出现壳/控制台上
  • tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl 2>&1 | grep "Bps"

    无输出。

    我对perl了解不多,但在我看来,这似乎是一个缓冲问题 - 不确定吗?任何帮助将不胜感激。

    +0

    的tcpdump -i eth0的-l -e -n “SRC portrange 22-233333或DST portrange 22-23333” 2>&1 | ./netbps.prl 2>&1是否输出任何内容?我删除了grep“Bps”? – Noproblem

    +0

    @Noproblem:是的,预期的输出显示在外壳/控制台上。 –

    +0

    tcpdump -i eth0 -l -e -n“src portrange 22-233333 or dst portrange 22-23333”2>&1 | ./netbps.prl >> /out.out 2>&1 – Noproblem

    回答

    5

    这是一个缓冲问题。将行STDOUT->autoflush(1)添加到netbps,它将工作。

    STDOUT通常是行缓冲的,因此printf末尾的换行符应该会触发缓冲区刷新,但是因为它被重定向到一个文件,所以它会像任何普通文件一样被缓冲。你可以看到这一点...

    $ perl -e 'while(1) { print "foo\n"; sleep 5; }' 
    

    VS

    $ perl -e 'while(1) { print "foo\n"; sleep 5; }' > test.out