Мне нужно интегрировать индикатор выполнения в операции на удаленном сервере по SSH.
В моей ситуации есть несколько циклов, которые запускают процессы на нескольких удаленных серверах по SSH. Эти процессы запускаются certainFunction
и занимают от 10 до 60 минут (в зависимости от многих непредсказуемых факторов). Поскольку процессы контролируются с главного сервера, я бы хотел отображать некую полосу прогресса на основе времени, например процент или полосу (НЕ точки или счетчик), которая будет показывать общий прогресс.
Это возможно?
В поисках какого-то экстравагантного решения я нашел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
Но если у вас нет измерения того, как продвигаются процессы, и вы не способны предоставить реалистичную оценку фактического прогресса, бесполезно предоставлять индикатор прогресса. Виджет часов вашего любимого оконного менеджера предоставит столько же релевантной информации.