Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Unix time命令会干扰正在运行的程序吗?_Bash_Unix_Time_Dacapo - Fatal编程技术网

Bash Unix time命令会干扰正在运行的程序吗?

Bash Unix time命令会干扰正在运行的程序吗?,bash,unix,time,dacapo,Bash,Unix,Time,Dacapo,从Unix命令开始,我就了解了时间是如何工作的。它派生一个新进程并在该新进程中执行命令。然而,我遇到了一种我无法理解的行为 我正试图介绍lusearch,这是一个市场的基准。我希望使用不同的配置(线程数和迭代次数)启动它,忽略基准测试输出,并使用时间记录实际时间、用户时间和系统时间。在绝大多数配置中,我的脚本工作正常,启动基准测试并记录时间 对于一个特定的配置(大数据集、两个线程和十次迭代),基准有时无法达到终止(80%的情况下,几乎100个可能性中)。这是我用来启动它的命令: (time -p

从Unix命令开始,我就了解了时间是如何工作的。它派生一个新进程并在该新进程中执行命令。然而,我遇到了一种我无法理解的行为

我正试图介绍lusearch,这是一个市场的基准。我希望使用不同的配置(线程数和迭代次数)启动它,忽略基准测试输出,并使用时间记录实际时间、用户时间和系统时间。在绝大多数配置中,我的脚本工作正常,启动基准测试并记录时间

对于一个特定的配置(大数据集、两个线程和十次迭代),基准有时无法达到终止(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次):

这种行为只会发生在这个基准测试中——以及在这个配置中——而如果配置其他基准测试,或者使用不同数量的线程或不同数量的迭代,我看不到同样的事情发生。我的猜测是,这与时间正在做的干扰基准的事情有关

我不知道fork+exec如何改变基准行为。有什么具体的原因会导致这种情况吗?例如:时间是否也在使用基准想要使用的资源?启动基准测试时我做错了什么?

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

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


我严重怀疑这与时间有关。如果您在这里没有更好的答案,可以询问帮助bash列表,但是如果没有更好的信息,他们将无法获得更好的结果。

注意,有一个shell内置的“time”和一个可执行文件/usr/bin/time。你知道你用的是哪一种吗?(可能是前者)你是对的,我使用的是前者。由于时间使用了一个进程槽,它和其他一些资源,可能是测试装备达到了一些资源限制(进程数、线程数、文件描述符、内存?)海森堡、煎蛋卷蛋,任何东西都可以…@wildplasser In Bash,
time
在技术上是一个修饰符,它是管道语法的一部分。就语法而言,它与否定运算符(
)完全相同。在这方面,它不同于所有其他内置命令和关键字。我想不出有什么额外的进程、fd或重要的内存会导致副作用。好吧,这可能是一个隐藏的bash功能。。。我没有检查代码,但在这种情况下,bash显然执行了标准的fork+exec+wait+getrusage。它将消耗一个进程槽,但这也是“直接”fork+exec+wait()的成本。我的案子到此为止。谢谢你的回答。我尝试在后台发送第二个命令,得到了相同的结果。如果我不将stderr重定向到/dev/null,我会得到一个异常堆栈跟踪,表明所使用的文件系统资源已经关闭(不确定:不总是在同一个位置)。然而,我真的不明白这怎么可能“只”在我使用“时间”时发生(在其他情况下从未发生过)。呵呵,这很有趣。你能在其他贝壳中复制它吗?所有这些语法都应该适用于任何POSIX sh。如果不适用,则可能值得报告一个bug(当然,首先使用最新的Bash版本和补丁集进行测试)。使用系统调用跟踪器(strace)也可能有助于揭示问题。数字基准进行奇怪的低级操作可能会触发类似的事件。
(java -jar DaCapo.jar lusearch -s large -t 2 -i 10 >/dev/null 2>/dev/null)