Mostrar una barra de progreso mientras esperamos que regrese un proceso

Mostrar una barra de progreso mientras esperamos que regrese un proceso

Estoy mirando esta respuestaaquíy me gustaría implementar la barra de progreso mientras espero que se ejecute un proceso, o en mi caso, muchos.

Estoy ejecutando varias copias de sistemas de archivos grandes en paralelo usando el siguiente fragmento

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

y estoy buscando agregar la barra de progreso para que se muestre mientras espero que regresen los procesos en segundo plano.

Este es mi intento, ¿alguien puede decirme dónde me estoy equivocando o ayudarme a que funcione?

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

EDITAR: He actualizado el código original en esta pregunta a una solución funcional probada; sigo intentando que se ejecute hasta que vuelva la espera.

Por otra parte, no: el código original en la parte superior funciona bien tal como está y el siguiente fragmento también funciona como un fragmento de código independiente.

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

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

Respuesta1

waitse bloquea hasta que todos los trabajos en segundo plano hayan regresado, por lo que no puede usarlo como untilcondición, ya que se ejecutará solo una vez.

En su lugar , podrías usar [ -n "$(jobs)" ]para ver si tienes trabajos en ejecución:

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

Respuesta2

En GNU/Linux, puedes usarelVisor de progreso de Coreutils( progress, anteriormente conocido como cv):

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

información relacionada