Perl脚本记录到文件,输出滞后

时间:2013-10-06 20:48:16

标签: linux bash perl

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

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

我像这样./perlscript.pl > logfile.log启动我的perl脚本。

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

为了描述问题,我把它包装成这样:

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。

知道为什么吗?

2 个答案:

答案 0 :(得分:2)

我没有尝试复制你的行为,但它可能是一个stdout缓冲问题。试试:

$| = 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

答案 1 :(得分:0)

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