如何在bash中计算子进程的时间?

时间:2017-09-20 14:00:04

标签: bash time child-process

我有一个程序,它是一个编译的二进制文件,可以调用一大堆(~300)子bash脚本。我想要一种方法来计算每个子进程的时间,以找出哪些进程时间最长。问题来自于我无法更改已编译的二进制文件(通过添加例如time foo.sh >> bar_log.txt)。我可以更改子脚本,所以理论上我可以将它们移动到不同的位置并用脚本替换它们,这些脚本只用time命令从新位置调用它们,但是再次 - 有300多个独特的名字和诸如此类的。我想知道是否有办法调用原始二进制文件并获取执行子进程的时间日志。

提前致谢。

编辑:我也有限制访问其他程序,无法下载/安装新程序。例如,我没有atop.

1 个答案:

答案 0 :(得分:1)

环境变量ENV(对于POSIX shell;对于未在名称sh下启动时的bash,BASH_ENV),即使非交互式shell 也会被解析为在启动时运行的脚本的位置。

因此,您可以创建一个初始化跟踪的文件:

if [ -n "$BASH_VERSION" ]; then
  # SECONDS is time since the start of this individual script
  PS4=':$BASH_SOURCE:$LINENO:$SECONDS+'
else
  # note that calling $(date) slows your code substantially
  # nothing to do about it without shell extensions, however.
  PS4=':${0}:$(date)+'
fi
set -x

...并将ENVBASH_ENV都设置为指向该文件。