Bash shell脚本,用于100次迭代并记录日志时间

时间:2010-09-16 04:52:21

标签: bash

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

for i in 1 2 3
do
    command1
done

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

5 个答案:

答案 0 :(得分:19)

您也可以在迭代中使用seq

for i in `seq 1 100`; do ... done

答案 1 :(得分:10)

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

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

  1. for循环使用C风格语法从1到100迭代。
  2. echo printout中的$i打印当前的迭代编号。
  3. $(date)在每个打印输出中插入一个时间戳。
  4. time命令运行命令并打印执行所需的时间。
  5. 来自循环内部所有内容的输出通过管道传送到tee,这会将副本保存到timing.log
  6. 2>&1将stderr重定向到stdout,以便日志文件包含常规输出和错误消息。

答案 2 :(得分: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

它使用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

答案 3 :(得分:4)

您可以尝试:

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}'

解释

  • for循环运行some_script.sh 100次,用time
  • 测量其执行时间
  • for循环的stderr被重定向到stdout,这是为了捕获time的输出所以我们可以grep它
  • grep ^real只能获得以&#34;真实&#34;开头的行。在time
  • 的输出中
  • sed将删除行的开头至分钟部分(在time的输出中)
  • 对于每一行,awk添加总和,以便最终输出平均值,即总和,除以输入记录的数量(= NR)< / LI>

限制

该片段假定some_script.sh的运行时间小于1分钟,否则它根本不起作用。根据您的系统,time内置版可能会有不同的工作方式。另一种方法是使用time命令/ usr / bin / time而不是bash builtin。

注意:此脚本摘自here

答案 4 :(得分:1)

该脚本基于the answer from @marian0,但运行时间没有限制。将其命名为timeit.sh,然后执行./timeit.sh 10 ./script以运行./script 10次并打印平均时间。可以根据需要添加其他参数。

#!/bin/bash

for i in `seq 1 $1`; do
    time "${@:2}"
done 2>&1 |\
    grep ^real |\
    sed -r -e "s/.*real\t([[:digit:]]+)m([[:digit:]]+\.[[:digit:]]+)s/\1 \2/" |\
    awk '{sum += $1 * 60 + $2} END {print sum / NR}'