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配置并兼容HTTP实现代码解析
Mar 31 Servers
详解Nginx 工作原理
Mar 31 Servers
Nginx域名转发使用场景代码实例
Mar 31 Servers
详解nginx.conf 中 root 目录设置问题
Apr 01 Servers
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
Apr 04 Servers
学习nginx基础知识
Sep 04 Servers
Vertica集成Apache Hudi重磅使用指南
Mar 31 Servers
Mac电脑OS系统下安装Nginx的详细教程
Apr 14 Servers
Vscode中SSH插件如何远程连接Linux
May 02 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 Servers
SpringBoot前端后端分离之Nginx服务器下载安装过程
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
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
Python httplib模块使用实例
2015/04/11 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
django实现前后台交互实例
2017/08/07 Python
python 中的int()函数怎么用
2017/10/17 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Python的pygame安装教程详解
2020/02/10 Python
python线程join方法原理解析
2020/02/11 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
Python爬虫开发与项目实战
2020/12/16 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
合伙经营协议书范本
2014/09/13 职场文书
师德师风自查总结
2014/10/14 职场文书
幼师大班个人总结
2015/02/13 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python