是否有一个 unix 命令可以输出命令执行期间经过的时间?

是否有一个 unix 命令可以输出命令执行期间经过的时间?

我喜欢使用它time来找出一个命令需要多长时间才能执行,但是在处理内部执行子命令的命令(并提供输出让您知道每个子命令何时开始运行)时,能够知道特定子命令在多少秒(或毫秒)后开始运行真是太好了。

当我说子命令时,实际上唯一能够将它们与外部区分开来的方法就是打印到标准输出的任何内容。

这确实看起来应该是一个选择time

答案1

如果能够知道特定子命令在多少秒(或毫秒)后开始运行,那就太好了

一种可能性是使用这个bash变量:

此变量扩展为自​​ shell 启动以来的秒数。赋值此变量会将计数重置为赋值,扩展后的值变为赋值加上自赋值以来的秒数。

为了将其与输出流相结合,请考虑这个专用脚本,它为每个输入行添加一个时间戳:

$ cat timestamp-output
#!/bin/bash
while read line
do
  printf "%05d %s\n" $SECONDS "$line"
done

并将脚本的输出导入该脚本。

$ your-script | timestamp-output

例子:

$ cat your-script
#!/bin/bash
for i in 1 2 3 4
do
  echo "step $i started";
  sleep $(($RANDOM%10));
done

$ your-script | timestamp-output

输出:

00000 步骤 1 已启动
00002 步骤 2 已启动
00010 步骤 3 已启动
00015 步骤 4 已启动


这可以细化为只对表示子命令开始的输出行进行时间戳记,假设它们可以被 grep :

#!/bin/bash
regex="^start of command"
while read line
do
 if [[ "$line" =~ $regex ]]; then
   printf "%05d %s\n" $SECONDS "$line"
 else
   echo "$line"
 fi
done

示例脚本:

#!/bin/bash
for i in 1 2 3 4
do
  echo "start of command: $i";
  echo some output
  echo other output
  sleep $(($RANDOM%10));
done

示例输出:

00000 命令开始:1
一些输出
其他输出
00002 命令开始:2
一些输出
其他输出
00006 命令开始:3
一些输出
其他输出
00008 命令开始:4
一些输出
其他输出

答案2

如果您需要了解子进程何时开始运行,您可以使用strace -f -tt和分析输出,或者可能使用您自己的脚本来为您完成此操作。

相关内容