Como usar “progress-bar.sh” para exibir o andamento das operações que ocorrem em servidores remotos

Como usar “progress-bar.sh” para exibir o andamento das operações que ocorrem em servidores remotos

Preciso integrar uma barra de progresso às operações no servidor remoto por SSH.

Na minha situação, existem vários loops que acionam processos em alguns servidores remotos via SSH. Esses processos estão sendo acionados certainFunctione levam de 10 a 60 minutos (dependendo de muitas coisas imprevisíveis). Na medida em que os processos são controlados a partir de um servidor principal, gostaria de exibir alguma barra de progresso com base no tempo, como porcentagem ou barra (NÃO pontos ou girador), que indicaria um progresso geral.

Isso é possível?

Procurando por alguma solução extravagante que encontreiprogress-bar.shO projeto de Édouard Lópezpara ser adequado às minhas necessidades.

Aqui está o código para 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
}

Pode ser usado para minha situação? Estou procurando uma solução Bash pura, sem a instalação de pacotes adicionais.

Responder1

Escrever uma barra de progresso é fácil; esse não é o seu problema. Você poderia usar

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   "

}

ou algo assim

O principal problema é determinar qual é o seu progresso. Se você tentar fazer isso na hora certa, certamente terá uma falsa sensação de progresso, porque o processo (cito): leva de 10 a 60 minutos (dependendo de muitas coisas imprevisíveis).

Se for apenas baseado no tempo, você poderia usar:

while [ $progress -lt 100 ] ; do
    progress=$((progress+1))
    prt_bar
    sleep 10
done
echo 
echo done

Mas se não tivermos uma medida de como os processos estão a progredir e não formos capazes de fornecer uma estimativa realista do progresso real, é inútil fornecer uma barra de progresso. O widget de relógio do seu gerenciador de janelas favorito forneceria o máximo de informações relevantes.

informação relacionada