我需要将进度条集成到通过 SSH 对远程服务器进行的操作中。
在我的环境中,有几个循环通过 SSH 触发几个远程服务器上的进程。这些进程被触发certainFunction
并需要 10 到 60 分钟(取决于许多不可预测的因素)。只要进程是由主服务器控制的,我就想根据时间显示一些进度条,比如百分比或条形图(而不是点或微调器),以指示总体进度。
这可能吗?
寻找我发现的一些奢侈的解决方案Édouard Lopez 的progress-bar.sh
项目适合我的需要。
代码如下progress-bar.sh
:
progress-bar() {
local duration=${1}
already_done() { for ((done=0; done<$elapsed; done++)); do printf "▇"; done }
remaining() { for ((remain=$elapsed; remain<$duration; remain++)); do printf " "; done }
percentage() { printf "| %s%%" $(( (($elapsed)*100)/($duration)*100/100 )); }
clean_line() { printf "\r"; }
for (( elapsed=1; elapsed<=$duration; elapsed++ )); do
already_done; remaining; percentage
sleep 1
clean_line
done
clean_line
}
它能用于我的情况吗?我正在寻找一个纯 Bash 解决方案,不需要安装任何额外的软件包。
答案1
编写进度条很容易;这不是你的问题。你可以使用
declare -i progress
progress=1
declare -i width
width=$(tput cols)-10
declare -i pbarlength
prt_bar(){
pbarlength=$((width*progress/100))
echo -en "\r"
for i in `seq $pbarlength` ; do
echo -n '='
done
echo -en " $progress "
}
或类似的东西
主要问题是确定你的进度。如果你真的想按时完成,你肯定会产生虚假的进度感,因为这个过程(我引用):需要 10 到 60 分钟(取决于许多不可预测的事情)。
如果仅基于时间,则可以使用:
while [ $progress -lt 100 ] ; do
progress=$((progress+1))
prt_bar
sleep 10
done
echo
echo done
但是,如果您无法衡量进程的进展情况,也无法提供实际进度的现实估计,那么提供进度条是没有用的。您最喜欢的窗口管理器的时钟小部件将提供同样多的相关信息。