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 certainFunction
und 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.sh
Das 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.