shell进度条追踪指令执行时间的场景分析

目录
  • 代码
  • 使用说明
  • 效果展示

最近一两年,我经手了不少与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进度条追踪指令执行时间内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Powershell检查网站响应并计算执行时间例子

    有时候你需要知道命令的执行时间,例如,你可以使用Invoke-WebReques查看网站的响应,再使用Measure-Command计算执行的时间. 复制代码 代码如下: $url = 'http://www.powershell.com'     # track execution time: $timeTaken = Measure-Command -Expression {   $site = Invoke-WebRequest -Uri $url }   $milliseconds =

  • shell 进度条实现代码

    复制代码 代码如下: #!/bin/bashCOUNTER=0_R=0_C=`tput cols`_PROCEC=`tput cols`tput cup $_C $_Rprintf "["while [ $COUNTER -lt 100 ]do    COUNTER=`expr $COUNTER + 1`    sleep 0.1    printf "=>"    _R=`expr $_R + 1`    _C=`expr $_C + 1`    tput

  • PowerShell计算脚本执行时间的实现方法

    另一个方法是设置两个时间快照和结束时间,计算它们的时差.这将告诉你Get-Hotfix执行了多久,得到的输出数据里将包含脚本执行的时间: 复制代码 代码如下: $start = Get-DateGet-HotFix$end = Get-DateWrite-Host -ForegroundColor Red ('Total Runtime: ' + ($end - $start).TotalSeconds) 文章出处:http://www.pstips.net/

  • linux shell进度条实现方法

    直接看代码吧,很简单 复制代码 代码如下: #!/bin/bash b=''i=0while [ $i -le  100 ]do    printf "progress:[%-50s]%d%%\r" $b $i    sleep 0.1    i=`expr 2 + $i`            b=#$bdoneecho

  • shell脚本实现多彩进度条

    先贴代码 #!/bin/bash i=0; str="" arr=("|" "/" "-" "\\") while [ $i -le 100 ] do let index=i%4 let indexcolor=i%8 let color=30+indexcolor printf "\e[0;$color;1m[%-100s][%d%%]%c\r" "$str" &qu

  • shell进度条追踪指令执行时间的场景分析

    目录 代码 使用说明 效果展示 最近一两年,我经手了不少与shell相关的工作.在这个过程中,我越发觉得shell脚本在完成具体任务的同时,应该再给用户展示一个进度条,用以提示当前阶段还需要多少时间才能完成. linux中的不少软件都有进度条,比如yum的软件安装过程,docker的镜像拉取过程.本想借鉴这些软件的进度条的实现方法,但其开发语言大都不是shell,我就只好作罢.随后,我在网上搜索shell进度条的实现方法,而找到的大都是用for或while循环在控制台上直接打印等号或箭头,并在循

  • Linux简易彩色进度条的实例代码

    在实现进度条之前,我们需要先简单了解一些知识: 一.缓冲区: 缓冲区分为无缓冲.行缓冲.全缓冲. 无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr. 行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作.典型的代表是键盘的操作. 全缓冲:表示的是输入输出写满缓冲区才执行I/O操作.典型的代表是磁盘的读写. 所以我们在实现的时候需要每次输出完都需要使用fflush(stdout)将缓冲区刷新,以便下一次的输出. 二.'\r'和 '\n'的区别: 回车用'\r'表

  • 使用php+apc实现上传进度条且在IE7下不显示的问题解决方法

    今天整理以前写过的关于上传文件,并显示进度条的程序代码,对该代码进行优化整理.解决了一直困扰的问题:有时进度条没有达到100%,浏览器出现假死现象.在IE8.chrome测试非常完美. 项目需求: 上传APK,显示上传进度条,上传完成开始分析APK,并显示:正在分析apk数据,请稍后... ,分析完成后,显示:上传成功,重新上传 由于我电脑装的是winxp英文版,IE默认的是IE7,在测试的时候发现进度条不显示.百分比也不显示. 排除问题: 1.将DOM改成jquery方式,不显示 2.给递归调

  • Linux用make指令编译进度条程序

    本文实例为大家分享了Linux下写一个简单进度条的具体代码,供大家参考,具体内容如下 首先建立一个新的文件,touch progress_bar.c 执行该vim progress_bar.c命令,写进度条的程序.写进一个进度条程序: #include<stdio.h> #include<unistd.h> #include<string.h> void progress() { int i = 0; char bar[102]; memset(bar,0,102*si

  • unity实现场景切换进度条显示

    本文实例为大家分享了unity实现场景切换进度条显示的具体代码,供大家参考,具体内容如下 一.UI.建立slider适当更改即可: 二.新增loadScene脚本,用来进行场景切换,将其绑定任意物体上面.博主以放置主相机为例.参数分别为进度条(用来设置value值),显示进度文本text: 在设置中加入两个场景: 三.脚本: /// <summary> /// 场景切换 /// 在unity 获取当前加载进度progress中,其中最多到0.9.只有等到加载到第二个场景才会到1 /// 所有在

  • JS实现进度条顺滑版详细方案

    进度条不顺滑 相信大多前端同学都自己写过音频.视频播放器,实现并不复杂.最近在小程序里,做了一个类似微博刷视频的需求.其中有一部分功能需要实现自定义进度条,在做完第一版之后发现进度条不顺滑,而后想查查网上看有没有什么好的方案,但最终没找到合适的.于是想看看微信小程序里的"微博"进度条如何,结果也是很生硬的动画,下面放了一个GIF,大家也可以自己搜索微信小程序的微博,找个视频看看效果. 常规方案 最终决定还是优化一下这个问题,先来捋一捋我们现有常规方案. 监听TimeUpdate事件 获

  • AngularJS实现进度条功能示例

    本文实例讲述了AngularJS实现进度条功能的方法.分享给大家供大家参考,具体如下: 一.功能描述: ① 通过select标签,可以为进度条选择不同的样式(颜色) ② 进度条的进度通过文本框里面的值改变(也可以快捷的选择几个特定的值) ③ 通过checkbox按钮,控制进度条上的文字是否显示 二.代码实现: <!DOCTYPE html> <html lang="en" ng-app='app'> <head> <meta charset=&

随机推荐