通常情况下,当我想要分析脚本或运行的命令时,我只需调用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添加到捆绑脚本中的每个客户端脚本源中。
答案 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