假设我在一个名为launcher.sh的脚本中启动了三个脚本(a.sh b.sh c.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秒的总执行时间?
答案 0 :(得分:4)
使用wait
:
first=`date +%s`
./a.sh &
./b.sh &
./c.sh &
wait
...
引用help wait
:
wait: wait [id]
Wait for job completion and return exit status. Waits for the process identified by ID, which may be a process ID or a job specification, and reports its termination status. If ID is not given, waits for all currently active child processes, and the return status is zero. If ID is a a job specification, waits for all processes in the job's pipeline. Exit Status: Returns the status of ID; fails if ID is invalid or an invalid option is given.
答案 1 :(得分:2)
linux附带了time
命令,该命令专门针对这种确切用法而设计。只需致电time yourscript
。
当您的启动器脚本在后台启动进程时,仅time
是不够的。正如@devnull所述,有wait
命令阻止调用,直到所有子进程都终止。
有一种简单的方法来组合等待和时间,无需修改启动器脚本,也无需手动停止时间:
time `./launcher.sh;wait `
应该这样做。
(尝试使用一个最小的例子。只要你在子shell中执行启动器+等待(使用``),这将起作用(但是如果它确实输出了什么,你就会从launcerh脚本中丢失输出)) p>
最小例子:
test1.sh
./test2.sh &
test2.sh
sleep 10
结果:
$ time`。/ test1.sh; wait`
真实0m10.004s
用户0m0.001s
sys 0m0.001s
答案 2 :(得分:0)
在退出脚本之前写一下
echo $SECONDS
或者在终端窗口中运行脚本,输入
$> time your_script