網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
shell進(jìn)度條追蹤指令執(zhí)行時(shí)間的場(chǎng)景分析_linux shell
作者:農(nóng)民工老王 ? 更新時(shí)間: 2022-08-07 編程語(yǔ)言最近一兩年,我經(jīng)手了不少與shell相關(guān)的工作。在這個(gè)過(guò)程中,我越發(fā)覺(jué)得shell腳本在完成具體任務(wù)的同時(shí),應(yīng)該再給用戶展示一個(gè)進(jìn)度條,用以提示當(dāng)前階段還需要多少時(shí)間才能完成。
linux中的不少軟件都有進(jìn)度條,比如yum的軟件安裝過(guò)程,docker的鏡像拉取過(guò)程。本想借鑒這些軟件的進(jìn)度條的實(shí)現(xiàn)方法,但其開(kāi)發(fā)語(yǔ)言大都不是shell,我就只好作罷。隨后,我在網(wǎng)上搜索shell進(jìn)度條的實(shí)現(xiàn)方法,而找到的大都是用for或while循環(huán)在控制臺(tái)上直接打印等號(hào)或箭頭,并在循環(huán)體中用sleep命令實(shí)現(xiàn)一個(gè)固定的停頓,因而進(jìn)度條完成的時(shí)間是固定的,而且在打印進(jìn)度條時(shí)也沒(méi)有實(shí)現(xiàn)具體任務(wù)。那種進(jìn)度條是完全沒(méi)有意義的。
于是,我就自己實(shí)現(xiàn)了一個(gè)shell進(jìn)度條,測(cè)試表明實(shí)現(xiàn)了既定目標(biāo)。可以追蹤指令的執(zhí)行時(shí)間。如果在預(yù)定用時(shí)之前完成,那么進(jìn)度條會(huì)接到通知,然后立刻跑完剩余進(jìn)度;如果指令的運(yùn)行用時(shí)超出預(yù)定時(shí)間,那么進(jìn)度條會(huì)在96%的地方等待指令跟上,然后再跑完剩余的4%。
本文中的進(jìn)度條可以應(yīng)用于大部分場(chǎng)景。不用修改進(jìn)度條函數(shù)的任何代碼,就可以直接使用。特別適合那些可預(yù)估指令執(zhí)行時(shí)間的場(chǎng)景。對(duì)于如下載、文件復(fù)制等可以準(zhǔn)確地計(jì)算出進(jìn)度數(shù)值的情況,也可以基本滿足,還可以參考本文的思路,修改進(jìn)度條函數(shù),進(jìn)而顯示精確的進(jìn)度數(shù)值。
代碼
代碼如下:
#!/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 "進(jìn)度條參數(shù)錯(cuò)誤" 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" } # 多線程調(diào)用進(jìn)度條函數(shù),參數(shù)表示預(yù)估的大概時(shí)間。參數(shù)中的s表示時(shí)間單位秒,還可以用m表分鐘。 progressBar 20s & # 調(diào)用進(jìn)度條后,就是完成具體操作的代碼。 echo "模擬一個(gè)24秒執(zhí)行完成的任務(wù)。" sleep 24 # 通知進(jìn)度條函數(shù)完成進(jìn)度 echo "1" >"$progressBarTempPath" wait
使用說(shuō)明
使用非常簡(jiǎn)單,按照以下兩步操作即可。
- 將代碼中的第56、57行換成您實(shí)際需要執(zhí)行的命令。最好屏蔽其運(yùn)行過(guò)程中的輸出。
- 將代碼中第53行的方法調(diào)用參數(shù)
20s
換成你預(yù)估的實(shí)際時(shí)間。
效果展示
原文鏈接:https://blog.csdn.net/monarch91/article/details/124788554
相關(guān)推薦
- 2023-07-06 Mac安裝python3并配置環(huán)境變量
- 2022-01-31 有關(guān)“數(shù)據(jù)統(tǒng)計(jì)”的一些概念 -- PV UV VV IP跳出率等
- 2022-09-21 Redis緩存更新策略詳解_Redis
- 2023-04-07 C#中將dateTimePicker初始值設(shè)置為空_C#教程
- 2022-03-26 C++中靜態(tài)數(shù)據(jù)成員使用示例_C 語(yǔ)言
- 2023-03-28 Golang使用gzip壓縮字符減少redis等存儲(chǔ)占用的實(shí)現(xiàn)_Golang
- 2022-03-31 C語(yǔ)言類的雙向鏈表詳解_C 語(yǔ)言
- 2022-07-08 C#中的圖像Image類與打印Printing類用法_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支