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
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
Mar 31 Servers
利用Nginx代理如何解决前端跨域问题详析
Apr 02 Servers
HDFS免重启挂载新磁盘
Apr 06 Servers
Nginx反向代理、重定向
Apr 13 Servers
tomcat下部署jenkins的方法
May 06 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
Windows server 2012 NTP时间同步的实现
Jun 25 Servers
vscode远程免密登入Linux服务器的配置方法
Jun 28 Servers
Zabbix对Kafka topic积压数据监控的解决方案
Jul 07 Servers
搭建zabbix监控以及邮件报警的超级详细教学
Jul 15 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
Joomla开启SEF的方法
2016/05/04 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python书单 不将就
2017/07/11 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python绘制规则网络图形实例
2019/12/09 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
对公司合理化的建议书
2014/03/12 职场文书
教师演讲稿大全
2014/05/16 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
2019销售早会主持词
2019/06/27 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
浅谈redis整数集为什么不能降级
2021/07/25 Redis