Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
如何知道linux中的执行时间_Linux_Bash_Shell_Scheduled Tasks_Fork - Fatal编程技术网

如何知道linux中的执行时间

如何知道linux中的执行时间,linux,bash,shell,scheduled-tasks,fork,Linux,Bash,Shell,Scheduled Tasks,Fork,假设我有三个脚本(a.sh b.sh c.sh)要在名为launcher.sh的脚本中启动: first=`date +%s` ./a.sh & ./b.sh & ./c.sh & final=`date +%s` executionTime=`echo "scale=3;($final - $first)/3600" | bc` echo $executionTime 我知道上面的脚本不会工作,因为launcher.sh将在启动a.sh、b.sh和c.sh后立

假设我有三个脚本(a.sh b.sh c.sh)要在名为launcher.sh的脚本中启动:

first=`date +%s`

./a.sh &
./b.sh &
./c.sh &

final=`date +%s`

executionTime=`echo "scale=3;($final - $first)/3600" | bc`

echo $executionTime
我知道上面的脚本不会工作,因为launcher.sh将在启动a.sh、b.sh和c.sh后立即完成。在没有“&”的情况下启动a.sh、b.sh和c.sh是浪费时间,因为它们不必互相等待

假设它们的执行时间分别为5秒、10秒和7秒,如何获得10秒作为总执行时间?

使用
wait

first=`date +%s`

./a.sh &
./b.sh &
./c.sh &

wait

...
正在引用帮助等待:

first=`date +%s`

./a.sh &
./b.sh &
./c.sh &

wait

...
wait:wait[id]

等待作业完成并返回退出状态。
等待由ID标识的进程,ID可以是进程ID或
作业规范,并报告其终止状态。如果ID不是
给定,等待所有当前活动的子进程,并返回
状态为零。如果ID是作业规范,则等待所有进程
在工作的管道中。
退出状态:
返回ID的状态;如果ID无效或选择了无效选项,则失败
鉴于

linux附带了
time
命令,该命令是专门为这种用途而设计的。只需调用
计时脚本

由于启动程序脚本在后台启动进程,
光靠时间是不够的。如@devnull所述,有
wait
命令阻止调用,直到所有子进程终止

有一种简单的方法可以组合等待和时间,无需修改启动程序脚本,也无需手动停止时间:

time `./launcher.sh;wait `
我们应该做到这一点

(用一个简单的例子尝试了这个方法。只要在子shell中执行launcher+wait(使用``),它就会工作(但是如果Launceh脚本确实输出了一些东西,您就会从它中释放otuput))


最简单的例子:

test1.sh

./test2.sh &
test2.sh

sleep 10
结果:

$time`./test1.sh;等等`

真正的0m10.004s
用户0m0.001s
系统0m0.001s


在退出脚本之前,请编写

echo $SECONDS
或者要在终端窗口中运行脚本,请键入

$> time your_script

@德夫努尔姆。。。我们必须在这一点上达成一致。我将编辑此答案,以参考并提供wokring解决方案。我已经尝试了@JohannesH的解决方案。提到使用时间,但它不起作用。@MarcusThornton查看我的编辑。这基本上是devnull建议和我最初的解决方案的结合(所以也要归功于他)。我对此进行了测试,它应该可以工作,并且是最简单的方法。IMHO.test.sh:sleep 20 test2.sh:./test.sh和time./test2.sh;等待真正的0m0.005s用户0m0.002s sys 0m0.001s它似乎不起作用我用两个脚本对此进行了测试:一个脚本执行
sleep 10
,另一个调用第一个脚本(当然使用
&
对其进行后台监控)。我回答中的命令在10秒后显示10秒运行时间。@谢谢你教我一些关于降价的新知识。(我想知道为什么改变没有任何效果。)顺便问一下,我能要求更多吗?手册上说等待当前活动的子进程,但子进程是否有可能不是活动的?如果子进程称为sleep,这是一个活动进程吗?如果它调用sleep,它仍然被认为是活动的。@MarcusThornton,正如Johannes所提到的,即使您正在调用
sleep
,它也是活动的。“活动”是指此处正在运行的进程。@MarcusThornton甚至被阻止(在进程控制术语中),僵尸进程将被视为活动进程。基本上,每个未被安排停止的进程(通常通过发送sigterm)都是无效的。