【问题标题】:Calculate time for each step of a shell script and show total execution time计算 shell 脚本每一步的时间并显示总执行时间
【发布时间】:2018-08-11 15:43:43
【问题描述】:

我有下面的脚本,为了满足要求,我必须为每个脚本放置一些函数,以获取每个脚本的时间信息,最后显示总时间。

我的主要脚本如下所示:

/u01/scripts/stop.sh ${1} | tee ${stop_log}    
/u01/scripts/kill_proc.sh ${1} | tee ${kill_log}    
/u01/scripts/detach.sh ${1}| tee ${detach_log}   
/u01/scripts/copy.sh ${1} | tee ${copy_log}   

我想使用类似下面的函数来获取每个脚本的执行时间,最后使用一个全局变量我可以显示所有脚本所花费的总时间。

我在下面创建但不幸的是我无法正常使用,如果您在这里有什么好心的帮助。

time_check()    
{         
  export time_log=${log}/time_log_${dts}.log          
  echo 'StartingTime:'date +%s > ${time_log}       
  echo 'EndingTime:'date +%s >> ${time_log}           
}          

我想使用类似上面的函数来获取每个脚本的执行时间,最后使用一个全局变量我可以显示所有脚本所花费的总时间。任何人都可以指导如何获得所需的结果。

【问题讨论】:

    标签: linux bash shell unix scripting


    【解决方案1】:

    如果你对秒的时间粒度没问题,你可以简单地这样做:

    start=$SECONDS
    /u01/scripts/stop.sh ${1} | tee ${stop_log}
    stop=$SECONDS   
    /u01/scripts/kill_proc.sh ${1} | tee ${kill_log}
    kill_proc=$SECONDS   
    /u01/scripts/detach.sh ${1}| tee ${detach_log}
    detach=$SECONDS  
    /u01/scripts/copy.sh ${1} | tee ${copy_log}
    end=$SECONDS
    
    printf "%s\n" "stop=$((stop-start)), kill_proc=$((kill_proc-stop)), detach=$((detach-kill_proc)), copy=$((end-detach)), total=$((end-start))"
    

    您也可以编写一个函数来执行此操作:

    time_it() {
      local start=$SECONDS rc
      echo "$(date): Starting $*"
      "$@"; rc=$?
      echo "$(date): Finished $*; elapsed = $((SECONDS-start)) seconds"
      return $rc
    }
    

    对于 Bash 版本 >= 4.2,您可以使用 printf 打印日期,而不是调用外部命令:

    time_it() {
      local start=$SECONDS ts rc
      printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
      printf '%s\n' "$ts Starting $*"
      "$@"; rc=$?
      printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
      printf '%s\n' "$ts Finished $*; elapsed = $((SECONDS-start)) seconds"
      return $rc
    }
    

    并将其调用为:

    start=$SECONDS
    time_it /u01/scripts/stop.sh ${1} | tee ${stop_log}    
    time_it /u01/scripts/kill_proc.sh ${1} | tee ${kill_log}    
    time_it /u01/scripts/detach.sh ${1}| tee ${detach_log}   
    time_it /u01/scripts/copy.sh ${1} | tee ${copy_log}
    echo "Total time = $((SECONDS-start)) seconds"
    

    相关:

    【讨论】:

    • 感谢您的快速建议。我会检查你的方法。此外,如果我们可以放置任何功能,这是主要要求。如果我们可以在函数中放置任何可用于最后显示结果的全局变量。
    • 太棒了。感谢您的帮助,看来它会满足我的要求。我会检查并进一步更新。谢谢,
    • 你好,我刚试过这个功能。对于 printf 第 23 行,我得到了类似下面的内容: printf: `(': invalid format character
    • 检查您的 bash 版本。如果您有
    • 好的,明白了。这个功能对我来说很好,但它不支持任何步骤失败的情况。我将创建另一个问题。感谢您的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多