【问题标题】:Unable to redirect output of a perl script to a file无法将 perl 脚本的输出重定向到文件
【发布时间】:2015-10-25 19:04:12
【问题描述】:

尽管这个问题听起来很愚蠢,但我还是坚持了下来。 Ubuntu 14.04CentOS 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

我正在尝试将此输出捕获到文件中,但是我无法这样做。我尝试了以下方法:

  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 文件。外壳/控制台上没有输出。

  1. 管道和 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/控制台上没有输出。

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

【问题讨论】:

  • tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl 2>&1 这个命令有输出吗?我删除了 grep "Bps"?
  • @Noproblem:是的,预期的输出出现在 shell/console 上。
  • tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl >>/out.out 2>&1
  • 行为与 1 相同 -- 生成空的 out.out 文件并且在控制台/bash 上没有输出
  • 这可能是由于脚本的输出被缓冲了尝试在netbps 脚本的while 循环之前添加$|=1;。这将在打印某些内容时刷新输出。

标签: bash perl shell diamond-operator


【解决方案1】:

这是一个缓冲问题。将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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多