用于100次迭代的bash shell脚本和记录的时间

use*_*122 14 bash

如何使用bash shell脚本运行100次迭代?我想知道执行一个命令需要多长时间(开始和结束时间).我想跟踪当前正在运行的迭代.我想记录每次迭代.我有一个自动脚本我需要运行并记录它.

for i in 1 2 3
do
    command1
done
Run Code Online (Sandbox Code Playgroud)

但我想知道完成一次迭代需要多长时间 - 并将信息写入日志文件中!

Gad*_*lin 19

您也可以seq在迭代中使用:

for i in `seq 1 100`; do ... done
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 11

for ((i = 1; i <= 100; i++)); do
    echo "--- Iteration #$i: $(date) ---"
    time command1
done 2>&1 | tee timing.log
Run Code Online (Sandbox Code Playgroud)

这里有很多事情要做.发生了什么?

  1. for从1到100使用C语言风格的语法循环迭代.
  2. $i回声打印打印当前迭代次数.
  3. $(date) 在每个打印输出中插入一个时间戳.
  4. time命令运行命令并打印执行所需的时间.
  5. 循环内部所有内容的输出都是通过管道输出的tee,这样可以保存副本timing.log.
  6. 2>&1重定向错误输出到标准输出,这样的日志文件将包含常规输出和错误消息.


pax*_*blo 7

以下脚本显示了一种方法.

#!/usr/bin/bash
for i in {1..100} ; do
    echo =============================
    echo "Number $i: $(date +%Y-%m-%d-%H:%M:%S)"
    ( time ( echo $i ; sleep 1 ) ) 2>&1 | sed 's/^/   /'
done | tee timing.log
Run Code Online (Sandbox Code Playgroud)

它使用bash范围功能运行循环的100次迭代,输出循环计数器和日期.

然后echo $i ; sleep 1它会对您的命令进行计时(在这种情况下)并将标准输出和错误组合在一起,然后将其格式化,并将其发送到终端和日志文件以供以后分析.

一次五次迭代:

pax> testprog.sh
=============================
Number 1: 2010-09-16-13:44:19
   1
   real 0m1.063s
   user 0m0.077s
   sys  0m0.015s
=============================
Number 2: 2010-09-16-13:44:20
   2
   real 0m1.056s
   user 0m0.030s
   sys  0m0.046s
=============================
Number 3: 2010-09-16-13:44:21
   3
   real 0m1.057s
   user 0m0.046s
   sys  0m0.030s
=============================
Number 4: 2010-09-16-13:44:22
   4
   real 0m1.057s
   user 0m0.061s
   sys  0m0.031s
=============================
Number 5: 2010-09-16-13:44:23
   5
   real 0m1.057s
   user 0m0.046s
   sys  0m0.015s
Run Code Online (Sandbox Code Playgroud)


mar*_*an0 5

您可以尝试:

for i in {1..100}; do time some_script.sh; done 2>&1 | grep ^real | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'
Run Code Online (Sandbox Code Playgroud)

说明

  • for循环运行some_script.sh 100次,使用以下命令测量其执行时间: time
  • for循环的stderr重定向到stdout,这是为了捕获输出,time因此我们可以对它进行grep
  • grep ^real 是仅获得输出的以“ real”开头的行 time
  • sed是删除行的开始,直到分钟部分(在的输出中time
  • 对于每一行,awk将总和相加,以便最后可以输出平均值,即总和除以输入记录数(= NR)。

局限性

该代码段假定some_script.sh的运行时间少于1分钟,否则它将根本无法工作。根据您的系统,time内置函数可能会有所不同。另一种选择是使用时间命令/ usr / bin / time代替内置的bash。

注意:此脚本是从此处提取的。