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优化的六点方法
Mar 31 Servers
Nginx配置并兼容HTTP实现代码解析
Mar 31 Servers
制作能在nginx和IIS中使用的ssl证书
Jun 21 Servers
Nginx location 和 proxy_pass路径配置问题小结
Sep 04 Servers
Apache Hudi数据布局黑科技降低一半查询时间
Mar 31 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 Servers
聊聊配置 Nginx 访问与错误日志的问题
May 25 Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 Servers
Linux中一对多配置日志服务器的详细步骤
Jul 23 Servers
centos环境下nginx高可用集群的搭建指南
Jul 23 Servers
ubuntu20.04虚拟机无法上网的问题及解决
Dec 24 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下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
opencv python图像梯度实例详解
2020/02/04 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
Python接收手机短信的代码整理
2020/08/02 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
预备党员思想汇报
2014/01/08 职场文书
低碳环保演讲稿
2014/08/28 职场文书
人口与计划生育责任书
2015/05/09 职场文书
母亲去世追悼词
2015/06/23 职场文书
2019年教师入党申请书
2019/06/27 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
用Python生成会跳舞的美女
2022/01/18 Python