Unix时间命令可以干扰正在运行的程序吗?

时间:2012-12-13 12:04:49

标签: bash unix time dacapo

在Time Unix命令的this answer上,我得到了关于时间如何工作的基本概念。它会分叉一个新进程并在该新进程中执行该命令。但是,我遇到了一种我无法理解的行为。

我正在尝试分析 lusearch DaCapo benchmark suite的基准。我想用不同的配置(线程数和迭代次数)启动它,忽略基准输出并使用 time 来记录实际,用户和系统时间。使用绝大多数配置,我的脚本运行正常,启动基准并记录时间。

使用一个特定配置(大型数据集,两个线程和十次迭代),基准测试有时不会达到终止(80%的情况,几乎100个试验中)。这是我用来启动它的命令:

(time -p java -jar DaCapo.jar lusearch -s large -t 2 -i 10 
 >/dev/null 2>/dev/null) 2>&1 | awk '{print $2 $4 $6}' > timed &

但是,如果我没有预先计算时间,基准测试只会在100%的时间内终止(大约100个试验):

(java -jar DaCapo.jar lusearch -s large -t 2 -i 10 >/dev/null 2>/dev/null)

此行为仅在此基准测试中发生 - 并且使用此配置 - 而如果配置文件某些其他基准测试或使用不同数量的线程或不同的迭代次数,我看不到同样的事情发生。我的猜测是它与时间正在干扰基准测试的事情有关。

我没有看到fork + exec如何改变基准行为。有什么具体可以导致这种情况吗?例如:是时候使用基准测试想要使用的一些资源了吗?我在启动基准测试时做错了什么?

1 个答案:

答案 0 :(得分:1)

“未达成终止”非常模糊。由于您要将所有内容发送到/dev/null,因此您将错过任何错误消息。如果不了解这个程序的作用,没有错误消息,没有回溯,就不可能给出明确的答案。

我能想到的唯一实际差异是你在第二种情况下没有背景。具有某些管道和重定向组合的Bash在后台处理时不会隐式地将/dev/null重定向到stdin。程序的某些部分可能对此很敏感。有关需要显式重定向的示例,请参阅我的testcases。 Bash在这里并不完全遵循POSIX,并且与异步列表,管道和重定向的某些组合的所有其他shell不同。

我严重怀疑它与time有什么关系。如果你在这里没有得到更好的答案,可以询问帮助重击列表,但如果没有更好的信息,他们将无法做到更好。