定时源bash脚本

时间:2014-04-03 05:17:58

标签: bash time

通常情况下,当我想要分析脚本或运行的命令时,我只需调用time程序。

但是这一次(没有双关语),我想测量执行源脚本所需的时间,例如:

/usr/bin/time source myscript.sh

但是我收到以下错误:

/usr/bin/time: cannot run source: No such file or directory

以这种方式采购:

/usr/bin/time . myscript.sh

简单地给我这个错误:

/usr/bin/time: cannot run .: Permission denied

我可以通过以下两种方式调用它:

/usr/bin/time ./myscript.sh
/usr/bin/time bash myscript.sh

但是我采购脚本非常重要。有谁知道我怎么能这样做?


附加上下文

我们有许多很复杂的脚本,这些脚本知道如何获取其他“客户端”脚本的特定“集合”。我们将这些脚本称为“捆绑”。

bundle-a.sh
bundle-b.sh
...
bundle-z.sh

这并不完全是如何命名的,但它的目的是在这个例子中显示其中的26个。每个包都包含许多逻辑,每个包调用一组特定的客户端脚本。

有数百个客户端脚本,其中一些包含几行代码,另一些则非常复杂,需要花费数小时才能执行。

client-000.sh
client-001.sh
...
client-300.sh

我们还提供了一个脚本,作为我们的bundle脚本和客户端脚本的API库。这个API中有很多很多功能。

api.sh

因此捆绑脚本会提供API库以及每个客户端脚本。我们这样做是为了可以调用bundle(调用一组客户端脚本),或者有时我们只需要直接调用特定的客户端脚本。它的实现方式是,如果执行bundle,API库只会被提取一次(而不是再次从客户端脚本中获取)。

所以这一切都很好地运作了很长时间。现在我正在尝试将/ usr / bin / time添加到捆绑脚本中的每个客户端脚本源中。

2 个答案:

答案 0 :(得分:2)

如果您真的,真的需要获取源脚本的系统和用户时间,您可以使用来自不同shell的strace来观看您正在计时的那个,跟踪对getrusage的调用,并检查返回值。

Shell 1(您将为脚本计时)

$ echo $$
12345

Shell 2(你将追踪的地方)

$ strace -etrace=getrusage -v -p 12345
Process 12345 attached - interrupt to quit

Shell 1:

$ time : ; . myscript.sh ; time :
real 0m0.000s  
(( time output and script output, then time output again)

Shell 2:将输出类似

的内容
getrusage(RUSAGE_SELF, {ru_utime={0, 12000}, ru_stime={0, 16001}, ru_maxrss=2364, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=1551, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=1032, ru_nivcsw=3}) = 0
getrusage(RUSAGE_CHILDREN, {ru_utime={0, 0}, ru_stime={0, 4000}, ru_maxrss=1216, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=5143, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=57, ru_nivcsw=21}) = 0
getrusage(RUSAGE_SELF, {ru_utime={0, 448028}, ru_stime={0, 16001}, ru_maxrss=2364, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=1552, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=2141, ru_nivcsw=22}) = 0
getrusage(RUSAGE_CHILDREN, {ru_utime={0, 0}, ru_stime={0, 4000}, ru_maxrss=1216, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=5143, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=57, ru_nivcsw=21}) = 0

注意ru_utime结构元素中的值是如何变化的?不同之处在于shell本身使用了多少用户CPU时间。有关您所看到的具体内容的详细信息,请参阅man getrusage。从那里,它只是自动提取那些并找到差异。

答案 1 :(得分:0)

在您对./ 的引用中可能只是缺少myscript.sh(我注意到您在工作示例中使用,但在其他地方没有使用)

已在Ubuntu(Trusty64)和Darwnin / BSD下测试过 - 只需使用以下工作正常:

time source ./myscript.sh

FWIW,我使用以下脚本来确认source命令实际上是否正确执行:

#!/usr/bin/env sh

V_FIRST=1
export V_SECOND=2

在darwin下执行:

$ time source ./test.sh ; set | grep -i V_

real    0m0.000s
user    0m0.000s
sys 0m0.000s
RBENV_SHELL=bash
V_FIRST=1
V_SECOND=2

在Ubuntu下执行:

$ time source ./test.sh ; set | grep -i V_

real    0m0.000s
user    0m0.000s
sys 0m0.000s
V_FIRST=1
V_SECOND=2