So verwenden Sie „progress-bar.sh“, um den Fortschritt von Vorgängen anzuzeigen, die auf Remote-Servern stattfinden

So verwenden Sie „progress-bar.sh“, um den Fortschritt von Vorgängen anzuzeigen, die auf Remote-Servern stattfinden

Ich muss einen Fortschrittsbalken in Vorgänge auf einem Remote-Server über SSH integrieren.

In meiner Situation gibt es mehrere Schleifen, die Prozesse auf einigen Remote-Servern über SSH auslösen. Diese Prozesse werden ausgelöst certainFunctionund dauern zwischen 10 und 60 Minuten (abhängig von vielen unvorhersehbaren Dingen). Soweit die Prozesse von einem Hauptserver aus gesteuert werden, möchte ich einen zeitbasierten Fortschrittsbalken anzeigen, beispielsweise als Prozentsatz oder Balken (KEINE Punkte oder Spinner), der den Gesamtfortschritt anzeigt.

Ist das möglich?

Auf der Suche nach einer extravaganten Lösung fand ichprogress-bar.shDas Projekt von Édouard Lopezfür meine Bedürfnisse geeignet sein.

Hier ist der Code für 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
}

Kann es für meine Situation verwendet werden? Ich suche nach einer reinen Bash-Lösung, bei der keine zusätzlichen Pakete installiert werden müssen.

Antwort1

Einen Fortschrittsbalken zu schreiben ist einfach; das ist nicht Ihr Problem. Sie könnten verwenden

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   "

}

oder etwas ähnliches

Das Hauptproblem besteht darin, Ihren Fortschritt zu bestimmen. Wenn Sie versuchen, es anhand der Zeit zu tun, werden Sie höchstwahrscheinlich ein falsches Gefühl von Fortschritt bekommen, da der Prozess (ich zitiere): zwischen 10 und 60 Minuten dauert (abhängig von vielen unvorhersehbaren Dingen).

Wenn es nur auf dem Timing basiert, könnten Sie Folgendes verwenden:

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

Wenn Sie jedoch nicht wissen, wie die Prozesse voranschreiten, und keine realistische Einschätzung des tatsächlichen Fortschritts abgeben können, ist die Bereitstellung eines Fortschrittsbalkens nutzlos. Das Uhr-Widget Ihres bevorzugten Fenstermanagers würde ebenso viele relevante Informationen liefern.

verwandte Informationen