Linux/Unix Shell Scripting - Barra de progreso con dialog y rsync

 
Vista:
sin imagen de perfil
Val: 50
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Barra de progreso con dialog y rsync

Publicado por caic (99 intervenciones) el 21/03/2018 17:15:20
Hola,

Estoy haciendo un script con menús para automatizar la descarga de logs de diferentes máquinas y me gustaría mostrar una barra de progreso mientras se descargan.

Lo que tengo hasta ahora es:

Pasando los números del 1 al 100 a este comando dialog consigo hacer la barra:

1
2
3
4
5
for i in {1..100}
do
   echo "$i"
   sleep 1
done | dialog --title "Prueba" --gauge "Prueba barra progreso" 20 70

Por otro lado, para conseguir un porcentaje total de la descarga uso rsync:

1
rsync -a --info=progress2 $maquina:$ruta .

Con el rsync consigo un output similar a este:

1
2
$ rsync -a --info=progress2 $maquina:$ruta .
     36,389,835   1%    6.19MB/s    0:07:16  xfr#2, to-chk=156/195)

Pero no he sido capaz de pasarle únicamente el número del % al dialog.

He probado incluso redirigiendo la salida del rsync a un fichero:

1
$ rsync -a --info=progress2 $maquina:$ruta . > noseyo

Para luego probar todo esto sin éxito:

1
2
3
$ tail -f noseyo | awk '{print $2}'
$ tail -f noseyo | cut -c10-
$ tail -f noseyo | while read uno dos resto; do echo $dos; done

¿Alguna idea?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Barra de progreso con dialog y rsync

Publicado por Tom (361 intervenciones) el 21/03/2018 18:00:58
No es que te pueda ayudar mucho, no uso rsync ni puedo probarlo.
Yo supongo que rsync cada vez que actualiza la línea de progreso, lo que hará será finalizarla con "\r\c" para que el cursor quede en la misma línea pero al principio.
O sea, algo parecido a lo que uso en este miniscript (kk.sh):
1
2
3
4
5
6
7
8
#!/bin/bash
 
for I in {1..10}
do
	echo -e "\t$I%\r\c"
	sleep 1
done
echo "done"

Si probamos este script con 'cat -v' sale:

1
2
3
/tmp$ /tmp/kk.sh | cat -v
	1%^M	2%^M	3%^M	4%^M	5%^M	6%^M	7%^M	8%^M	9%^M	10%^Mdone
/tmp$

Probando con read (lo que va en -d es <ctrl>v<ctrl>m), he podido "separarlo" así:

1
2
3
4
5
6
7
8
9
10
11
/tmp$ /tmp/kk.sh | while read -d '^M' W; do echo "/$W/"; done
/1%/
/2%/
/3%/
/4%/
/5%/
/6%/
/7%/
/8%/
/9%/
/10%/

Si esto funciona con rsync, quedaría parsear la línea de entrada y hacer el echo de lo que quieres para que el pipe de dialog lo lea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 50
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Barra de progreso con dialog y rsync

Publicado por caic (99 intervenciones) el 21/03/2018 18:56:43
He avanzado algo. Antes no me salía nada en los comandos que ejecutaba y era porque no estaba redirigiendo las salidas.

Sin embargo, ahora haga lo que haga:

1
2
3
$ rsync -a --info=progress2 $maquina:$ruta . 1>&2 | awk '{print $2}'
$ rsync -a --info=progress2 $maquina:$ruta . 1>&2 | while read -d '^M' A; do echo $A | awk '{print $2}'; done
$ rsync -a --info=progress2 $maquina:$ruta . 1>&2 2> noseyo | tail -f noseyo | while read -d '^M' A; do echo $A | awk '{print $2}'; done

Me sale siempre toda la salida del rsync. Como si no se "empipara":

1
2
$ rsync -a --info=progress2 $maquina:$ruta . 1>&2 2> noseyo | tail -f noseyo | while read -d '^M' A; do echo $A | awk '{print $2}'; done
     38,880,154   1%    5.01MB/s    0:08:58  xfr#2, to-chk=171/195)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Barra de progreso con dialog y rsync

Publicado por Tom (361 intervenciones) el 21/03/2018 19:16:19
Vaya, pues lo acabo de probar y parece que podría funcionar:

1
2
3
4
5
6
7
8
9
10
11
/tmp/borrame$ rsync -a --info=progress2 localhost:/usr/local/ftp/ . | while read -d'^M' A B C
> do
> echo "$B"
> done
 
0%
1%
2%
3%
...
...
Lo que ocurre es que rsync me pide la password del usuario, y eso me impide probar el dialog (no puedo introducirla porque oculta la entrada del terminal)

Si hago la copia sin host, para que no pe pida passwd, la cosa funciona bien:

1
rsync -a --info=progress2 /usr/local/ftp/ . | while read -d'^M' A B C; do expr "$B" : '\(.*\)%'; done | dialog --title "Prueba" --gauge "Prueba barra progreso" 20 70
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 50
Ha mantenido su posición en Linux/Unix Shell Scripting (en relación al último mes)
Gráfica de Linux/Unix Shell Scripting

Barra de progreso con dialog y rsync

Publicado por caic (99 intervenciones) el 22/03/2018 12:36:36
Pues no sé qué hago mal pero ejecutando el mismo comando que tú no obtengo nada:

1
2
$  rsync -a --info=progress2 $maquina:$ruta . | while read -d'^M' A B C; do echo $B; done
|

He puesto un pipe debajo del comando para indicar donde se me queda el cursos parpadeando. Es todo lo que me muestra.

Igual el problema es que no estoy usando un Linux real. Lo he probado en Cygwin y en MacOS.

Por cierto, lo de la contraseña lo solucioné con un intercambio de claves.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Barra de progreso con dialog y rsync

Publicado por Tom (361 intervenciones) el 22/03/2018 15:22:46
Podría ser lo que comentas ... ¿ otros usos del pipe te funcionan bien ? ¿ O será por la emulación del tty ?
¿ has probado mi shell script como puse un poco más arriba, a ver si las lineas ya leídas te van saliendo bien, a intervalos de 1 segundo o te salen todas de golpe ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar