如何测量 sleep() 花费的总累计时间?

如何测量 sleep() 花费的总累计时间?

我正在分析一个用 bash 和 python 编写的工具。来自顶层的调用会遍历多层bash和python程序。完成时间约为小时(4-5 小时)。在这些迷宫般的调用中,有许多调用sleep()分布在许多文件/程序上。不同地方的睡眠时间是不同的。该工具是单线程

main.sh 调用 foo.sh 和 bar.sh 的示例。实际的工具有更多的文件,每个文件都很大,并且调用sleep().更改所有文件(foo.sh、bar.sh)是不可行的。理想情况下,我想在 main.sh 中添加一些内容。

# main.sh
foo.sh
for (something):
  bar.sh    

# foo.sh
<stuff>
sleep 10
<stuff>
sleep 30
bar.sh
<stuff>
compute.py arg1 arg2

# bar.sh
<stuff>
while (something): 
  sleep 15
<stuff>

我想知道在 中花费的总时间sleep()

有没有办法获得sleep()工具启动和完成之间所花费的总时间?

除此之外,您有任何您认为可能有帮助的建议/方向吗?是否有某种方法可能仅适用于 bash 或仅适用于 python?

答案1

一种选择可能是使用类似的东西sysdig。如果我有一个像这样的 shell 脚本:

#!/bin/bash

for ((i = 0; i < 10; ++i)); do
    sleep $((i + 5))
done

我可以像这样运行它:

ex.sh& sudo sysdig proc.ppid=$! and evt.type=nanosleep and evt.dir='>'
[1] 34548
5578 19:12:08.307269713 4 sleep (34550) > nanosleep interval=6000000000(6s)
19206 19:12:14.308052173 0 sleep (34559) > nanosleep interval=7000000000(7s)
30764 19:12:21.308769638 4 sleep (34560) > nanosleep interval=8000000000(8s)
44222 19:12:29.309508180 0 sleep (34561) > nanosleep interval=9000000000(9s)
62699 19:12:38.310298027 4 sleep (34569) > nanosleep interval=10000000000(10s)
79052 19:12:48.311058659 0 sleep (34570) > nanosleep interval=11000000000(11s)
100582 19:12:59.311839491 4 sleep (34578) > nanosleep interval=12000000000(12s)
123807 19:13:11.312590028 0 sleep (34586) > nanosleep interval=13000000000(13s)
145141 19:13:24.313375302 4 sleep (34587) > nanosleep interval=14000000000(14s)

在这里,我正在寻找其父进程在后台脚本 ( proc.ppid=$!) 中的任何进程,该进程正在调用nanosleep系统调用 ( evt.type=nanosleep),即系统调用进入事件 ( evt.dir='>')。由于该脚本首先想到的是 invoke sleep,因此最终错过了第一个事件。

该工具有很多过滤选项;你可以看到详细信息用户指南。您可能需要调整过滤器以符合您的用例。例如,我花了一些实验才找到sleep用于睡眠的特定系统调用。

相关内容