Question Afficher le progrès total en rsync: est-ce possible?


J'ai déjà recherché cette option, mais je n'ai trouvé que des solutions impliquant patches personnalisés. Le fait qu'il n'apparaisse pas dans --help et qu'aucune information supplémentaire ne peut être trouvée indique probablement que la réponse est non, mais j'aimerais que cela soit confirmé.

Est-il possible de montrer progression totale du transfert de fichier avec rsync?


195
2018-01-05 15:26


origine


Depuis rsync 3.1.0, la progression totale du transfert de fichiers de base est désormais incluse. Voir la réponse serverfault.com/a/441724/107793 pour plus de détails. - Florian Feldhaus
S'il vous plaît changer la réponse acceptée. @ La réponse de David est complètement inutile. - Navin


Réponses:


Danakim a raison. Il n'y a pas de moyen trivial d'ajouter un indicateur de progression totale.

La raison en est que, lorsque rsync examine une liste de fichiers à synchroniser, il ne sait pas à l'avance quels fichiers devront être modifiés. Si vous effectuez des transferts delta, les deltas eux-mêmes doivent être calculés à l'avance pour donner une image globale du travail à effectuer.

En d’autres termes, le moyen le plus simple de calculer le travail qui reste à faire est de le faire.


33
2018-01-06 04:10



Vous pouvez toujours avoir un indicateur simple comme (données transférées + données ignorées) / (données totales dans la source), ou (# fichiers transférés ou ignorés) / (# fichiers dans la source). Cela ne sera pas particulièrement précis, mais cela donnerait une idée. Bon pour les gros transferts à la fin de la journée, et vous vous demandez s'il ne faut pas attendre et éteindre l'ordinateur, ou le laisser fonctionner pour la nuit ... - naught101
Je ne crois pas que cette conclusion est correcte. Je pense que @ naught101 est plus juste face à la question, et je pense que prédire une réponse pour ne pas utiliser --size-onlyou similaire est encore plus inexact. - Evan Carroll
Au moment où j'ai écrit la réponse, elle était exacte - rsync ne disposait pas de mécanisme pour un indicateur de progression totale. Et oui, vous pourriez écrire le vôtre, mais très peu de gens le feraient. - David Mackintosh
Commentaire pour les nouveaux arrivants: C'est maintenant possible: serverfault.com/a/441724/422003 - imposeren


Il existe maintenant un moyen officiel de le faire dans rsync (version 3.1.0 du protocole, version 31, testée avec 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)

J'ai essayé avec mon /usr dossier parce que je voulais cette fonctionnalité pour transférer des systèmes de fichiers entiers, et /usr semblait être un bon échantillon représentatif.

le --info=progress2 donne un bon pourcentage global, même s'il ne s'agit que d'une valeur partielle. En fait, mon /usr le dossier contient plus de 6 concerts:

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

et rsync a pris beaucoup de temps pour tout analyser. Donc presque tout le temps que j'ai vu a été complété à environ 90%, mais néanmoins, il est réconfortant de voir que quelque chose est en train d'être copié :)

Références:


312
2017-10-24 11:13



Notez que cela a atterri en 3.1.0. Il est également important de noter que cela n'est pas nécessairement exact dans la perspective temporelle. Il indique essentiellement la quantité de données vérifiée sur le serveur distant. Et le taux est le taux auquel les données sont apprises pour être correctes du côté distant (que ce soit déjà le cas ou que les nouvelles données aient été transférées et rendues correctes). Donc, bien que très utile, vous devez comprendre les mises en garde. - Kevin Cox
Pour utiliser cela sur OSX avec homebrew, "brassez tap homebrew / dupes; brassez installez rsync" - Matt Carrier
A noter que --info=progress2 ne fonctionne pas avec -v - sanmai
Ajouter le --no-i-r allumez aussi, donc rsync ne numérise pas de manière incrémentielle mais complète avant la copie et sait + afficher la quantité de travail restante. - Alex
Notez que vous pouvez utiliser --human-readable (ou -h) pour voir la taille totale en Mo / Go .. en cours. - Nux


Vous pouvez avec 'pv' (apt-get install pv avec Debian et Ubuntu). Je recommande de surveiller le nombre de fichiers transférés, car la quantité de données transférées n’est pas corrélée à la taille des fichiers mais au delta entre la source et la destination. Et compter les fichiers comptera la même progression pour un grand delta et un autre avec un petit delta. Ce qui signifie que, dans tous les cas, l'estimation de l'ETA pourrait être très éloignée. L’ETA basé sur la taille ne fonctionne que si votre destination est vide, dans ce cas delta == taille de la source.

L'idée générale est d'émettre une ligne par fichier 'transféré' à partir de rsync et de compter ces lignes avec 'pv':

rsync -ai / source distante: / dest | pv -les [nombre de fichiers]> / dev / null

J'ai tendance à sauvegarder des systèmes de fichiers entiers (pour plusieurs raisons), dans ce cas, vous pouvez utiliser le beaucoup moins cher df pour obtenir le nombre de fichiers (plutôt que du ou find qui parcourra votre hiérarchie source une autre fois après que rsync l’a fait). L'option -x apparaît pour vous assurer que rsync reste sur le même système de fichiers source (et ne suit pas les autres montages internes):

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

Si vous voulez compter les fichiers dans / source de manière générale, utilisez find /source|wc -l (avertissement à nouveau: peut être lent et lourd sur les E / S).


42
2018-06-10 10:22



Comme spécifié par zerodeuz, utilisez "df" uniquement lorsque vous synchronisez la partition entière, comme df -i /source obtient le nombre d'inodes (fichiers) de toute la partition dans laquelle / source réside. Sinon utiliser 'find' pour compter les fichiers dans un répertoire à l'intérieur de l'expression "$ ()". - lepe
Une alternative à du ou find - disons que vous terminez une copie incomplète ou effectuez une mise à jour sur place avec des suppressions - consiste à utiliser rsync -ai --dry-run pour obtenir la même liste de fichiers, le cycle principal passera à pv - Izkata


Pour les longs transferts, je suis content de courir du -s sur les deux côtés. Même watch -n1 du -s, si je me sens vraiment inquiet.

watch exécute une commande (du -s ici) périodiquement (toutes les secondes ici) et affiche la sortie en plein écran.


28
2018-01-05 16:30



Merci pour l'exemple du watch commander! - Cam
// , Intelligent! Selon linfo.org: "La commande du (c.-à-d. Utilisation du disque) indique la taille des arborescences de répertoires, y compris tout leur contenu, ainsi que la taille des fichiers individuels. Elle est donc utile pour localiser les sources d'espace, c.-à-d. Les répertoires et les fichiers. qui consomment une quantité importante ou excessive d’espace sur un lecteur de disque dur (HDD) ou un autre support de stockage. " - Nathan Basanese
Je ne sais pas quel genre de longs transferts vous faites, où du est viable. du est lent comme le diable quand le résultat sera dans TB et M de fichiers. - Nobody
Pour mes "longs transferts", l'opération dure environ une heure, au cours de laquelle rsync s'exécute beaucoup plus lentement, car ils se disputent l'accès au disque. - Abhi Beckert


De même que --info = progress2 Vous pouvez également désactiver la récursion incrémentielle. Cela construira la liste complète des fichiers au début et vous donnera ainsi une meilleure idée de la progression globale (au moins en nombre de fichiers, je ne pense pas que cela analyse la taille du fichier). Il y a un compromis. Cela coûte plus cher en mémoire et retarde le début du transfert. Probablement mieux utilisé dans les connexions de liaison plus lente, et sûrement pas génial pour des gajillions de fichiers.

Ce qui suit est tiré de la page de manuel rsync sous les détails de -r --recursive

La récursion incrémentielle peut être désactivée à l'aide de la touche --no-inc-récursif option ou son plus court --no-i-r alias.

(la source: http://rsync.samba.org/ftp/rsync/rsync.html )

De même, si vous spécifiez --delete-before, il forcera la récursion complète au début, ce dont il a besoin pour supprimer les fichiers orphelins (fichiers présents dans la destination, mais pas dans la source).


20
2017-10-16 19:56



Merci pour cela, les autres réponses se traduisent par un% d'âge qui continue à monter et à descendre! - artfulrobot


Fondamentalement non. Vous pouvez uniquement afficher la progression par fichier avec l'indicateur --progress, mais c'est à peu près tout.

Je suppose que vous pouvez écrire un wrapper autour de celui-ci ou utiliser n'importe lequel des correctifs que vous avez déjà trouvés, mais vous devez vous demander si cela en vaut vraiment la peine. Avez-vous réellement besoin d'un progrès total pour rsync?


11
2018-01-05 15:50



Voici un script qui affiche la progression totale et la progression du fichier sous la forme d'une jolie barre de progression: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90 - j13r
Tu peux changer le chemin --progress travailler en utilisant --info=progress2, ça va vous montrer le progrès global. Vous devrez désactiver l’algorithme récursif incrémental pour qu’il soit utile. --info=progress2 --no-inc-recursive - mat
@ j13r, vous pouvez également partager cette information essentielle! sa bonne option! - skywinder


J'ai aussi cherché comment afficher la progression totale avec rsync et j'ai trouvé un répondeur utile à partir de ce post: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

En gros, vous pouvez utiliser --info = progress2 dans la version dev de rsync 3.1.0. Voici ce que le doc a dit:

Il existe également une option --info = progress2 qui génère des statistiques basées sur le transfert complet, plutôt que sur des fichiers individuels. Utilisez cet indicateur sans générer de nom de fichier (par exemple, évitez -v ou spécifiez --info = name0 si vous voulez savoir comment se déroule le transfert sans faire défiler l'écran avec beaucoup de noms. (Vous n'avez pas besoin de spécifier le - option progress pour utiliser --info = progress2.)


7
2017-07-04 14:30



--info=name0 est d'or - ipatch


J'ai utilisé la réponse de zerodeux et écrit mon propre petit 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=$(${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