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 相关文章推荐
Nginx实现反向代理
Sep 20 Servers
nginx基于域名,端口,不同IP的虚拟主机设置的实现
Mar 31 Servers
Nginx下配置Https证书详细过程
Apr 01 Servers
nginx部署多前端项目的几种方法
May 25 Servers
制作能在nginx和IIS中使用的ssl证书
Jun 21 Servers
nginx的zabbix 5.0安装部署的方法步骤
Jul 16 Servers
Nginx虚拟主机的配置步骤过程全解
Mar 31 Servers
nginx配置之并发频次限制
Apr 18 Servers
解决IIS7下无法绑定https主机的问题
Apr 29 Servers
Nginx HTTP跳转至HTTPS
May 15 Servers
git stash(储藏)的用法总结
Jun 25 Servers
nginx之queue的具体使用
Jun 28 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
PHP编程之高级技巧——利用Mysql函数
2006/10/09 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
Python错误的处理方法
2020/06/23 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
精彩自我鉴定
2014/01/16 职场文书
员工薪酬激励方案
2014/06/13 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
小学家长通知书评语
2014/12/31 职场文书
升学宴来宾致辞
2015/07/27 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书