Zeigen Sie einen Fortschrittsbalken an, während Sie auf die Rückkehr eines Prozesses warten.

Zeigen Sie einen Fortschrittsbalken an, während Sie auf die Rückkehr eines Prozesses warten.

Ich schaue mir diese Antwort anHierund ich möchte den Fortschrittsbalken implementieren, während ich auf die Ausführung eines Prozesses warte – oder in meinem Fall – mehrerer.

Ich führe mehrere Kopien großer Dateisysteme parallel aus und verwende dazu den folgenden Codeausschnitt

for svol in "${svols[@]}";
do
    syslog_info "copying $svol"
    ${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."
wait

und ich möchte den Fortschrittsbalken hinzufügen, der angezeigt wird, während ich darauf warte, dass die Prozesse im Hintergrund wieder aufgenommen werden.

Dies ist mein Versuch. Kann mir jemand sagen, was ich falsch mache, oder mir helfen, es zum Laufen zu bringen?

for svol in "${svols[@]}";
do
    syslog_info "copying $svol"
    ${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."

i=1
sp="/-\|"
echo -n ' '

until wait;
do
    printf "\b${sp:i++%${#sp}:1}"
    sleep 0.1
done

EDIT: Ich habe den ursprünglichen Code in dieser Frage zu einer getesteten funktionierenden Lösung aktualisiert - versuche immer noch, ihn zum Laufen zu bringen, bis die Wartezeit wiederkehrt

Nebenbei bemerkt - der Originalcode oben funktioniert so wie er ist einwandfrei und der folgende Codeausschnitt funktioniert auch als eigenständiger Code

i=1
sp="/-\|"
echo -n ' '

for i in {1..100};
do
    printf "\b${sp:i++%${#sp}:1}"
    sleep 0.1
done

Antwort1

waitblockiert, bis alle Hintergrundjobs zurückgegeben wurden. Sie können es daher nicht als untilBedingung verwenden, da es nur einmal ausgeführt wird.

Sie können stattdessen Folgendes verwenden, [ -n "$(jobs)" ]um zu prüfen, ob bei Ihnen Jobs ausgeführt werden:

while [ -n "$(jobs)" ]; do
  printf "\b${sp:i++%${#sp}:1}"
  sleep 0.1
done

Antwort2

Unter GNU/Linux können SieDieCoreutils-Fortschrittsanzeige( progress, früher bekannt als cv):

"${CP}" -p -- "$svol" "$somedir" & progress -mp "$!"

verwandte Informationen