1

我有一个 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。

知道为什么吗?

4

2 回答 2

2

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

$| = 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 有大量数据要发送,给人的印象是那条线正在停滞。

我忘了:正时管是从这里来的。

于 2013-10-06T20:53:14.520 回答
0

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

于 2013-10-06T22:16:10.353 回答