我有一个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。
知道为什么吗?
答案 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一样,因此它不会缓冲其输出。我不知道如何在你的情况下完全应用它,所以如果你想尝试它,你将不得不尝试一点。