shell进度条追踪指令执行时间的场景分析

 更新时间:2022年06月16日 10:41:26   作者:农民工老王  
这篇文章主要介绍了shell进度条如何追踪指令执行时间,本文中的进度条可以应用于大部分场景。不用修改进度条函数的任何代码,就可以直接使用,特别适合那些可预估指令执行时间的场景,需要的朋友可以参考下

最近一两年,我经手了不少与shell相关的工作。在这个过程中,我越发觉得shell脚本在完成具体任务的同时,应该再给用户展示一个进度条,用以提示当前阶段还需要多少时间才能完成。

linux中的不少软件都有进度条,比如yum的软件安装过程,docker的镜像拉取过程。本想借鉴这些软件的进度条的实现方法,但其开发语言大都不是shell,我就只好作罢。随后,我在网上搜索shell进度条的实现方法,而找到的大都是用for或while循环在控制台上直接打印等号或箭头,并在循环体中用sleep命令实现一个固定的停顿,因而进度条完成的时间是固定的,而且在打印进度条时也没有实现具体任务。那种进度条是完全没有意义的。

于是,我就自己实现了一个shell进度条,测试表明实现了既定目标。可以追踪指令的执行时间。如果在预定用时之前完成,那么进度条会接到通知,然后立刻跑完剩余进度;如果指令的运行用时超出预定时间,那么进度条会在96%的地方等待指令跟上,然后再跑完剩余的4%。

本文中的进度条可以应用于大部分场景。不用修改进度条函数的任何代码,就可以直接使用。特别适合那些可预估指令执行时间的场景。对于如下载、文件复制等可以准确地计算出进度数值的情况,也可以基本满足,还可以参考本文的思路,修改进度条函数,进而显示精确的进度数值。

代码

代码如下:

#!/bin/bash
progressBarTempPath=$(mktemp)
echo "0" >"$progressBarTempPath"
progressBar () {
  local time=$1
  local interval=1
  if [[ "${time}" == *"s" ]]; then
    interval=$(echo "scale=5;${time//s/}/60"|bc)
  elif [[ "${time}" == *"m" ]]; then
    interval=${time//m/}
  else
    echo "进度条参数错误"
    return 1
  fi
  local nowNum=1
  local str=''
  local postfix=('/' '-' '\' '|')
  while [ $nowNum -le 100 ]; do
    local needEnd=`cat "$progressBarTempPath"`
    local index=$((nowNum%4))
    printf "[%-50s %-3d%% %c]\r" "$str" "$nowNum" "${postfix[$index]}"
    nowNum=$((nowNum+1))
    if [ $needEnd -eq 1 ]; then
        sleep 0.1
    else
      if  [ $nowNum -le 20 ] ; then
          sleep  $interval
      elif [  $nowNum -gt 95  ];then
          local nowNumCopy=$nowNum
          while [ $needEnd -eq 0 ]; do
              sleep $interval
              local innerIndex=$(((nowNumCopy+1)%4))
              printf "[%-50s %-3d%% %c]\r" "$str" "$nowNum" "${postfix[$innerIndex]} "
              needEnd=$(cat "$progressBarTempPath")
              nowNumCopy=$((nowNumCopy+1))
          done
      else
          sleep $(echo "scale=5;${interval}/2"|bc)
      fi
    fi
    if (($nowNum % 2 == 0)); then
      str+='='
    fi
  done
  printf "\n"
}
# 多线程调用进度条函数,参数表示预估的大概时间。参数中的s表示时间单位秒,还可以用m表分钟。
progressBar 20s &
# 调用进度条后,就是完成具体操作的代码。
echo "模拟一个24秒执行完成的任务。"
sleep 24
# 通知进度条函数完成进度
echo "1" >"$progressBarTempPath"
wait

使用说明

使用非常简单,按照以下两步操作即可。

  • 将代码中的第56、57行换成您实际需要执行的命令。最好屏蔽其运行过程中的输出。
  • 将代码中第53行的方法调用参数20s换成你预估的实际时间。

效果展示

到此这篇关于shell进度条如何追踪指令执行时间的文章就介绍到这了,更多相关shell进度条追踪指令执行时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • bash脚本中$符号的具体使用

    bash脚本中$符号的具体使用

    $符号主要用于访问变量的值、参数扩展、算术运算以及命令替换等,本文主要介绍了bash脚本中$符号的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 一个可交互的并发ping检测脚本

    一个可交互的并发ping检测脚本

    可交互的并发ping检测脚本,供大家学习参考。重点& 跟wait,这样“并发”的结果是输出结果不是能按顺序,后台返回。如果需要再排序下
    2013-02-02
  • Shell脚本实现查杀子进程、僵尸进程

    Shell脚本实现查杀子进程、僵尸进程

    这篇文章主要介绍了Shell脚本实现查杀子进程、僵尸进程,本文直接给出实现代码,实现递归找到导致进程僵死的最底层子进程并杀除,需要的朋友可以参考下
    2015-01-01
  • Linux Shell 截取字符串的方法示例

    Linux Shell 截取字符串的方法示例

    这篇文章主要介绍了Linux Shell 截取字符串的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • bash脚本中-e、&和&&的使用

    bash脚本中-e、&和&&的使用

    bash脚本里面经常会看到-e、&和&&,你知道它的用法吗,本文主要介绍了bash脚本中-e、&和&&的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • linux shell脚本学习指南

    linux shell脚本学习指南

    这篇文章主要介绍了linux shell脚本学习指南的相关资料,需要的朋友可以参考下
    2022-09-09
  • Shell脚本之文件批量创建与修改的简单方法

    Shell脚本之文件批量创建与修改的简单方法

    有时需要将文件内容进行修改,如果文件数量不多可以一个一个修改,那么如果文件数量很多一个一个修改很麻烦,这篇文章主要给大家介绍了关于Shell脚本之文件批量创建与修改的相关资料,需要的朋友可以参考下
    2021-06-06
  • 一键配置CentOS iptables防火墙的Shell脚本分享

    一键配置CentOS iptables防火墙的Shell脚本分享

    这篇文章主要介绍了一键配置CentOS iptables防火墙Shell脚本分享,可保存到一个脚本文件中,在新安装的CentOS系统时一条命令搞定iptables配置,需要的朋友可以参考下
    2014-07-07
  • Linux下去掉^M的四种方法

    Linux下去掉^M的四种方法

    本文通过四种方法给大家介绍了Linux下去掉^M的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Shell退出状态码及其应用详解

    Shell退出状态码及其应用详解

    这篇文章主要介绍了Shell退出状态码及其应用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论