Unix时间命令会干扰正在运行的程序吗



从Time-Unix命令的这个答案中,我了解了时间是如何工作的。它分叉一个新进程并在该新进程中执行命令。然而,我遇到了一种我无法理解的行为。

我正在尝试评测lusearch,DaCapo基准测试套件的基准测试。我想用不同的配置(线程数量和迭代次数)启动它,忽略基准输出,并使用时间来记录真实的用户和系统时间。对于绝大多数配置,我的脚本运行良好,启动基准测试并记录时间。

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

(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如何改变基准行为。有什么具体的原因会导致这种情况吗?例如:时间是否也在使用某个基准测试想要使用的资源?我在启动基准测试时做错了什么?

"未达到终止"是相当模糊的。您将错过任何错误消息,因为您正在将所有内容发送到/dev/null。如果不知道这个程序的作用,没有错误消息,没有回溯,就不可能给出确切的答案。

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

我很怀疑这与time有任何关系。如果你在这里没有得到更好的答案,也许可以询问帮助bash列表,但如果没有更好的信息,他们就无法做到更好。

相关内容

  • 没有找到相关文章

最新更新