Pregunta Mostrando el progreso total en rsync: ¿es posible?


Ya busqué esta opción, pero solo encontré soluciones que involucran parches personalizados. El hecho de que no se muestre en --help y que no se pueda encontrar más información probablemente indica que las respuestas son "no", pero me gustaría ver esto confirmado.

Es posible mostrar progreso total de transferencia de archivos con rsync?


195
2018-01-05 15:26


origen


Desde rsync 3.1.0 ahora se incluye un progreso de transferencia de archivos total básico. Ver respuesta serverfault.com/a/441724/107793 para detalles. - Florian Feldhaus
Por favor, cambie la respuesta aceptada. La respuesta de @ David es completamente inútil. - Navin


Respuestas:


Danakim es correcto. No hay formas triviales de agregar un indicador de progreso total.

La razón de esto es que cuando rsync mira una lista de archivos para sincronizar, no sabe de antemano qué archivos necesitarán cambiar. Si está realizando transferencias delta, los deltas en sí deben calcularse con anticipación para obtener una imagen total del trabajo que debe realizarse.

En otras palabras, la manera más fácil de calcular la cantidad de trabajo que hay que hacer es hacerlo.


33
2018-01-06 04:10



Aún podría tener un indicador simple como (datos transferidos + datos omitidos) / (datos totales en la fuente), o (# archivos transferidos u omitidos) / (# archivos en la fuente). No va a ser particularmente preciso, pero daría una idea. Bien cuando estás haciendo una gran transferencia al final del día, y te estás preguntando si esperar y apagar la computadora, o dejarla correr por la noche ... - naught101
No creo que la conclusión sea correcta. Creo que @naput1010 es más justo para la pregunta, y creo que predecir una respuesta sobre no usar --size-only o similar es aún más inexacto. - Evan Carroll
En el momento en que escribí la respuesta, fue precisa: rsync no tenía un mecanismo para un indicador de progreso total. Y sí, podrías escribir el tuyo, pero muy poca gente lo haría. - David Mackintosh
Comentario para los recién llegados: ahora es posible: serverfault.com/a/441724/422003 - imposeren


Ahora hay una forma oficial de hacer esto en rsync (versión 3.1.0 protocolo versión 31, probado con Ubuntu Trusty 14.04).

#> ./rsync -a --info=progress2 /usr .
    305,002,533  80%   65.69MB/s    0:00:01  xfr#1653, ir-chk=1593/3594)

Lo intenté con mi /usr carpeta porque quería esta función para transferir sistemas de archivos completos, y /usr Parecía ser una buena muestra representativa.

los --info=progress2 da un buen porcentaje general, incluso si es solo un valor parcial. De hecho, mi /usr carpeta es más de 6 conciertos:

#> du -sh /usr
6,6G    /usr/

y rsync Tomó mucho tiempo para escanear todo. Así que casi todo el tiempo que he visto se completó en un 90%, pero es reconfortante ver que se está copiando algo :)

Referencias:


312
2017-10-24 11:13



Tenga en cuenta que esto ha aterrizado en 3.1.0. También es importante tener en cuenta que esto no es necesariamente preciso en la perspectiva del tiempo. Esencialmente, muestra la cantidad de datos que se ha verificado que existen en el extremo remoto. Y la velocidad es la velocidad a la que se aprenden los datos para que sean correctos en el extremo remoto (ya sea si ya fue así o si los nuevos datos se transfirieron y lo hicieron correcto). Entonces, aunque es muy útil, necesitas entender las advertencias. - Kevin Cox
Para usar esto en OSX con homebrew, "brew tap homebrew / dupes; brew install rsync" - Matt Carrier
Vale la pena señalar que --info=progress2 no funciona con -v - sanmai
Añade el --no-i-r cambiar también, entonces rsync no escanea de forma incremental pero completa antes de copiar y sabe + muestra cuánto trabajo queda. - Alex
Tenga en cuenta que puede utilizar --human-readable (o -h) para ver el tamaño total en MB / GB .. en progreso. - Nux


Puedes con 'pv' (apt-get install pv con debian y ubuntu). Recomiendo monitorear la cantidad de archivos transferidos, ya que la cantidad de datos transferidos no se correlaciona con el tamaño de los archivos sino en el delta entre el origen y el destino. Y contar los archivos contará el mismo progreso para un delta grande y otro con el delta pequeño. Lo que significa que, en cualquier caso, la estimación de ETA podría estar muy lejos. La ETA basada en el tamaño solo funciona si su destino está vacío, en este caso delta == tamaño de la fuente.

La idea general es emitir una línea por archivo 'transferido' desde rsync, y contar esas líneas con 'pv':

rsync -ai / source remote: / dest | pv -les [número de archivos]> / dev / null

Tiendo a hacer copias de seguridad de sistemas de archivos completos (por varias razones), en este caso puedes usar el más barato df para obtener el número de archivos (en lugar de du o find que atravesará su jerarquía de fuentes otra vez después de que rsync lo hiciera). La opción -x parece asegurar que rsync permanece en el mismo sistema de archivos de origen (y no sigue otros montajes internos):

rsync -aix / source remote: / dest | pv -les $ (df -i / source | perl -ane 'print $ F [2] if $ F [5] = ~ m: ^ /:')> / dev / null

Si desea contar los archivos en / source de una manera general, use find /source|wc -l (advertencia de nuevo: puede ser lento y pesado en E / S).


42
2018-06-10 10:22



Como zerodeuz especificó, use "df" solo cuando esté sincronizando la partición completa, como df -i /source obtiene el número de inodes (archivos) de todas las particiones en las que reside / source. De lo contrario utilizar 'Buscar' para contar archivos dentro de un directorio dentro de la expresión "$ ()". - lepe
Una alternativa a du o find - Digamos que está terminando una copia incompleta o haciendo una actualización en el lugar con eliminaciones - es usar rsync -ai --dry-run para obtener la misma lista de archivos que la ejecución principal pasará a pv - Izkata


Para transferencias largas, estoy contento con correr du -s a ambos lados. Incluso watch -n1 du -s, si me siento realmente ansioso.

watch ejecuta un comando (du -s aquí) periódicamente (cada 1 segundo aquí) y muestra la pantalla completa de salida.


28
2018-01-05 16:30



Gracias por el ejemplo de la watch ¡mando! - Cam
// ¡Listo! De acuerdo con linfo.org: "El comando du (es decir, el uso del disco) informa los tamaños de los árboles de directorios, incluidos todos sus contenidos y los tamaños de los archivos individuales. Esto lo hace útil para rastrear la basura, es decir, los directorios y archivos. que consumen grandes o excesivas cantidades de espacio en una unidad de disco duro (HDD) u otro medio de almacenamiento ". - Nathan Basanese
No sé qué tipo de transferencias largas haces, donde du es viable. du es muy lento cuando el resultado estará en TB y M de archivos. - Nobody
Para mis "transferencias largas", una operación du tarda aproximadamente una hora en completarse, durante la cual rsync se ejecuta mucho más lento, debido a que están luchando por el acceso al disco. - Abhi Beckert


Junto con --info = progress2 Tú también puedes deshabilitar la recursión incremental. Esto construirá la lista completa de archivos al principio y, por lo tanto, le dará una mejor idea del progreso general (al menos en la cantidad de archivos, no creo que escanee el tamaño del archivo). Hay una compensación. Esto es más costoso en memoria y retrasa el inicio de la transferencia real. Probablemente sea mejor usarlo en conexiones de enlace lento, y seguramente no sea bueno para gajillones de archivos.

Lo siguiente es de la página de manual de rsync bajo el detalle para -r --recursivo

La recursión incremental se puede desactivar usando la --no-inc-recursivo opción o es más corto --no-i-r alias.

(fuente: http://rsync.samba.org/ftp/rsync/rsync.html )

Además, si especifica --delete-before, forzará la recursión completa al principio, lo que necesita para eliminar archivos huérfanos (archivos que existen en el destino, pero no en la fuente).


20
2017-10-16 19:56



Gracias por esto, las otras respuestas dan como resultado un% de edad que sigue subiendo y bajando. - artfulrobot


Básicamente no. Solo puede mostrar el progreso por archivo con el indicador --progress, pero eso es todo.

Supongo que puede escribir un envoltorio alrededor de él o usar cualquiera de los parches que ya encuentra, pero debe preguntarse si realmente vale la pena, ¿realmente necesita un progreso total para rsync?


11
2018-01-05 15:50



Aquí hay una secuencia de comandos que muestra el progreso total y el progreso del archivo como una barra de progreso agradable: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90 - j13r
Puedes cambiar el camino --progress trabajar usando --info=progress2, te mostrará el progreso global. Tendrá que deshabilitar el algoritmo recursivo incremental para que sea útil, por lo que --info=progress2 --no-inc-recursive - mat
@ j13r puedes compartir esta idea como respuesta también! ¡Es una gran opción! - skywinder


También busqué cómo mostrar el progreso total con rsync y encontré un contestador útil en esta publicación: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

Básicamente, puedes usar --info = progress2 en la versión dev de rsync 3.1.0. Aquí es lo que el Doc ha dicho:

También hay una opción --info = progress2 que genera estadísticas basadas en la transferencia completa, en lugar de archivos individuales. Use este indicador sin mostrar un nombre de archivo (por ejemplo, evite -v o especifique --info = nombre0 si desea ver cómo se está realizando la transferencia sin desplazarse por la pantalla con muchos nombres) (No necesita especificar el - opción de progreso para utilizar --info = progress2.)


7
2017-07-04 14:30



--info=name0 es oro - ipatch


Usé la respuesta de zerodeux y escribí mi propio pequeño script de bash:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

7
2018-02-07 23:44





Usé la respuesta de zerodeux y escribí mi propio pequeño script BASH:

#!/bin/bash

RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"

#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)

${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"

Cambié la ejecución en seco de TODO a

TODO=$(find ${SOURCES} | wc -l)

¡Encuentra el número de archivos muy rápido!


6
2018-01-03 12:00



encontrar trabajos asi que mucho mejor que rsync --dry-run! - hopeseekr
find solo funciona si estas rsync-ing localmente. rsync --dry-run También funciona con fuentes remotas ... - voretaq7


Si no tiene la última versión de rsync (por ejemplo, OS X tiene 2.6.9) y no puede usar --info=progress2, aquí hay otra alternativa para salvarse de las páginas de texto de desplazamiento en progreso:

rsync -aPh <source> <destination> | xargs -L1 printf "\33[2K\rTransferring: %s"

Eso imprimirá, en una línea, el nombre del último archivo que se transfiere:

Transferring: the-latest.file


6
2018-05-02 09:18