Похожие вопросы

Использование wget для рекурсивного обхода сайта и загрузки изображений
Разделение архивов tar и их загрузка по одному
В скрипте bash, как сгенерировать случайную строку
Массовая очистка параметров URL из txt-файла
Сценарий Bash завершается ошибкой " синтаксическая ошибка в условном выражении"
Экранирование символов для точного условия grep в сценарии Bash
Могу ли я заставить bash в cygwin выполнить команду сразу после вызова?
Как впоследствии выполнить все команды в crontab?
команда cat выводит весь каталог при использовании в скрипте bash
Как запустить SAMBA на MAC OS X с терминала?
Переименование с помощью exiftool: как бороться с отсутствующими тегами?
Пакетная обработка ffmpeg?
Как ограничить разрешения cygwin в Windows 7
Как остановить терминал bash от добавления частей предыдущих команд в текущую строку?
Запуск jpegoptim в cronjob раз в неделю, на CentOS из cPanel, только для файлов, добавленных в течение прошлой недели?

Как использовать "progress-bar.sh" для отображения хода выполнения операций, выполняемых на удаленных серверах

мне нужно интегрировать индикатор выполнения для операций на удаленном сервере по SSH.

в моей ситуации есть несколько петель, которые запускают процессы на нескольких удаленных серверах по SSH. Эти процессы запускаются с помощью certainFunction и занять от 10 до 60 минут (в зависимости от многих непредсказуемых вещей). Поскольку процессы управляются с главного сервера, я хотел бы отобразить некоторый индикатор выполнения, основанный на времени, например, процент или бар (не точки или счетчик), который был бы указывает на общий прогресс.

это возможно?

В поисках какого-то экстравагантного решения я нашел Эдуарда Лопеса progress-bar.sh project подходит для моих потребностей.

здесь код progress-bar.sh:

progress-bar() {
  local duration=


    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 без установки дополнительных пакетов.

5
задан JakeGould
источник

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

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

0
отвечен Ljm Dullaart 2018-08-08 21:18:56
источник

Другие вопросы bash linux