【问题标题】:Perl script log to file, output lagPerl 脚本日志到文件,输出滞后
【发布时间】:2013-10-10 02:12:56
【问题描述】:

我有一个 Perlscript,它会解析一些日志文件,有时还会执行一个 bash 命令:

$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"\`;

我这样开始我的 perl 脚本./perlscript.pl > logfile.log

现在我在日志文件上做一个尾巴来观察进度,但是每次输出都会卡在我上面描述的那一行。 输出将在那里停止几秒钟,然后继续。 ???

为了描述我这样包装的问题:

print `date`;
$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"`;
print `date`;

输出显示该命令并没有消耗很多时间:

So 6. Okt 22:35:04 CEST 2013
So 6. Okt 22:35:04 CEST 2013

如果我在不将输出重定向到文件的情况下运行脚本,则没有 LAG。

知道为什么吗?

【问题讨论】:

标签: linux bash perl


【解决方案1】:

我没有尝试复制您的行为,但这可能是标准输出缓冲问题。尝试:

$| = 1;
$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"`;

更新

试图复制你观察到的行为:我不得不做出一些假设,但我相信我的怀疑是正确的。这里我是管道,但它与重定向到一个文件并拖尾该文件相同:

./test.pl |  awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

没有$| = 1,输出被缓冲和聚合:

2013-10-06 23:08:27 Saluton, mondo: /home/lserni/test.sh
2013-10-06 23:08:27
2013-10-06 23:08:27 Waiting 10s...
2013-10-06 23:08:27 Saluton denove!

修改后,每一行都在生成时打印出来:

2013-10-06 23:09:09 Saluton, mondo: /home/lserni/test.sh
2013-10-06 23:09:09
2013-10-06 23:09:09 Waiting 10s...
2013-10-06 23:09:19 Saluton denove!

我希望您的脚本正在执行需要几秒钟的某事,而这不会生成messagePath;并且输出将被延迟,直到 Perl 有相当大的数据块要发送,给人的印象是那条线在停止。

我忘了:定时管道来自here

【讨论】:

  • 谢谢解答,确实是缓冲问题。
【解决方案2】:

在像您这样的情况下,我使用unbuffer 命令取得了一些成功。它在一个看起来像是输出到 tty 的命令的环境中运行命令,因此它不会缓冲其输出。我不知道如何在你的情况下准确地应用它,所以如果你想尝试它,你将不得不尝试一下。

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 2013-12-10
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多