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 根据URL带的参数转发的实现
Apr 01 Servers
Windows下用Nginx配置https服务器及反向代理的问题
Sep 25 Servers
Nginx防盗链与服务优化配置的全过程
Jan 18 Servers
Nginx的基本概念和原理
Mar 21 Servers
基于Apache Hudi在Google云构建数据湖平台的思路详解
Apr 07 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 Servers
配置nginx负载均衡
May 06 Servers
鲲鹏 CentOS 7 安装Python3.7
May 11 Servers
Nginx 匹配方式
May 15 Servers
git stash(储藏)的用法总结
Jun 25 Servers
django项目、vue项目部署云服务器的详细过程
Jul 23 Servers
Centos7 Shell编程之正则表达式、文本处理工具详解
Aug 05 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
长波有什么东西
2021/03/01 无线电
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
JavaScript 的继承
2011/10/01 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
python模拟实现分发扑克牌
2020/04/22 Python
教师求职信范文分享
2013/12/27 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
效能风暴心得体会
2014/09/04 职场文书
聚会通知怎么写
2015/04/23 职场文书
外出考察学习心得体会
2016/01/18 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python