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 相关文章推荐
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
Jun 21 Servers
nginx前后端同域名配置的方法实现
Mar 31 Servers
Nginx反向代理多个服务器的实现方法
Mar 31 Servers
Nginx工作原理和优化总结。
Apr 02 Servers
windows下快速安装nginx并配置开机自启动的方法
May 11 Servers
nginx安装以及配置的详细过程记录
Sep 15 Servers
Kubernetes控制节点的部署
Apr 01 Servers
Windows server 2012 R2 安装IIS服务器
Apr 29 Servers
Tomcat弱口令复现及利用
May 06 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
Nginx配置使用详解
Jul 07 Servers
nginx访问报403错误的几种情况详解
Jul 23 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
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
PHP常用的三种设计模式
2017/02/17 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
javascript innerHTML使用分析
2010/12/03 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
如何使用angularJs
2017/05/08 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
socket + select 完成伪并发操作的实例
2017/08/15 Python
python分布式环境下的限流器的示例
2017/10/26 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
竞选班长演讲稿
2013/12/30 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
工程专业应届生求职信
2014/02/19 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸