栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

shell多进程实现进度条示例

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

shell多进程实现进度条示例

博客主页:https://tomcat.blog.csdn.net
博主昵称:农民工老王
主要领域:Java、Linux、K8S
期待大家的关注点赞收藏⭐留言

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

最近一两年,我经手了不少与shell相关的工作。在这个过程中,我越发觉得shell脚本在完成具体任务的同时,应该再给用户展示一个进度条,用以提示脚本执行完成还需要多少时间。我在网上查询了不少资料。而找到的大都是用for或while循环在控制台上直接打印等号或箭头,在循环体中用sleep命令实现一个固定的停顿,因而进度条完成的时间是固定的,而且在打印进度条时也没有实现具体任务。那种进度条是完全没有意义的。

于是我设计了一个进度条,测试表明实现了既定目标。可以在完成具体操作的过程中,反馈实际进度。如果在预定用时之前完成,那么进度条会接到通知,迅速跑完;如果脚本的运行用时超出预定时间,那么进度条会在96%的地方等待程序跟上,然后再跑完剩余进度。

代码

代码如下:

#!/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
使用说明

使用非常简单,按照以下两步操作即可。

  1. 将代码中的第56、57行换成您实际需要执行的命令。最好屏蔽其运行过程中的输出。
  2. 将代码中第53行的方法调用参数80s换成你预估的实际时间。
效果展示

播放视频查看效果


如需转载,请注明本文的出处:农民工老王的CSDN博客https://blog.csdn.net/monarch91 。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号