-1

Мне нужно интегрировать индикатор выполнения в операции на удаленном сервере через 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 ответ1

0

Написать индикатор выполнения легко; это не твоя проблема. Вы могли бы использовать

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

Но если у вас нет оценки того, как продвигаются процессы, и вы не способны дать реалистичную оценку фактического прогресса, бесполезно указывать индикатор выполнения. Виджет часов вашего любимого оконного менеджера предоставит как можно больше актуальной информации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .