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


Posted in Servers onJune 16, 2022

最近一两年,我经手了不少与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进度条如何追踪指令执行时间的文章就介绍到这了,更多相关shell进度条追踪指令执行时间内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
Mar 09 Servers
Apache站点配置SSL强制跳转443
Mar 09 Servers
Nginx快速入门教程
Mar 31 Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 Servers
浅谈Nginx 中的两种限流方式
Mar 31 Servers
Nginx域名转发https访问的实现
Mar 31 Servers
Nginx 根据URL带的参数转发的实现
Apr 01 Servers
Consul在linux环境的集群部署
Apr 08 Servers
Vscode中SSH插件如何远程连接Linux
May 02 Servers
讨论nginx location 顺序问题
May 30 Servers
Tomcat安装使用及部署Web项目的3种方法汇总
Aug 14 Servers
Linux服务器离线安装 nginx的详细步骤
Jun 16 #Servers
利用Apache Common将java对象池化的问题
Jun 16 #Servers
Tomcat 与 maven 的安装与使用教程
V Rising 服务器搭建图文教程
安装harbor作为docker镜像仓库的问题
openEuler 搭建java开发环境的详细过程
Jun 10 #Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 #Servers
You might like
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python基础教程之自定义函数介绍
2014/08/29 Python
详解Python中的join()函数的用法
2015/04/07 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
微信跳一跳游戏python脚本
2020/04/01 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Django操作session 的方法
2020/03/09 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
银行财务部实习生的自我鉴定
2013/11/27 职场文书
安全资金保障制度
2014/01/23 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
毕业典礼邀请函
2015/01/31 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
Go语言基础函数基本用法及示例详解
2021/11/17 Golang