Вопрос: Показывать общий прогресс в rsync: возможно ли это?


Я уже искал этот вариант, но нашел только решения, которые включают пользовательское исправление, Тот факт, что он не отображается в --help и не может быть больше информации, вероятно, указывает, что ответы «нет», но я хотел бы, чтобы это подтвердилось.

Можно ли показать общий ход передачи файлов с rsync?


188
2018-01-05 15:26


Источник


Начиная с rsync 3.1.0, в настоящее время имеется базовый общий прогресс в передаче файлов. См. Ответ serverfault.com/a/441724/107793 для деталей. - Florian Feldhaus
Пожалуйста, измените принятый ответ. @ Ответ Дэвида совершенно бесполезен. - Navin


Ответы:


Данаким правильный. Нет никаких тривиальных способов добавить общий индикатор прогресса.

Причина этого заключается в том, что когда rsync просматривает список файлов для синхронизации, он заранее не знает, какие файлы нужно будет изменить. Если вы делаете дельта-переводы, сами дельта должны быть рассчитаны заранее, чтобы дать общую картину работы, которая должна быть выполнена.

Другими словами, самый простой способ подсчитать, сколько работы предстоит сделать, - это на самом деле это сделать.


33
2018-01-06 04:10



У вас все еще может быть простой индикатор (передача данных + данные пропущены) / (общие данные в источнике) или (# файлы переданы или пропущены) / (# файлов в источнике). Это не будет особенно точной, но это дало бы идею. Хорошо, когда вы делаете большую передачу в конце дня, и вам интересно, стоит ли ждать и выключить компьютер, или позволить ему работать на ночь ... - naught101
Я не верю, что это правильно. Я думаю, что @ naught101 более справедливо относится к этому вопросу, и я думаю, что предикация ответа на неиспользование --size-only или тому подобное, является более неточным. - Evan Carroll
В то время, когда я написал ответ, он был точным - у rsync не было механизма для индикатора общего прогресса. И да, вы могли бы написать свои собственные, но очень мало людей. - David Mackintosh
Комментарий для новичков: теперь это возможно: serverfault.com/a/441724/422003 - imposeren


В настоящее время существует официальный способ сделать это в rsync (версия 3.1.0, версия протокола 31, протестированная с 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)

Я попытался с моим /usr потому что я хотел эту функцию для переноса всех файловых систем и /usr казалось, был хорошим представительным образцом.

--info=progress2 дает хороший общий процент, даже если это всего лишь частичная стоимость. На самом деле, мой /usr папка более 6 концертов:

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

а также rsync потребовалось много времени, чтобы просмотреть все. Поэтому почти все время процент, который я видел, составлял около 90%, но тем не менее приятно видеть, что что-то копируется :)

Рекомендации:


301
2017-10-24 11:13



Обратите внимание, что это приземлилось в 3.1.0. Важно также отметить, что это не обязательно точно в перспективе. Фактически это показывает количество данных, которые были проверены на наличие на удаленном конце. И скорость - это скорость, с которой данные изучаются правильно на удаленном конце (независимо от того, было ли это уже так, или были переданы новые данные и сделали их правильными). Поэтому, хотя очень полезно, вам нужно понять оговорки. - Kevin Cox
Чтобы использовать это на OSX с homebrew, «варить крана homebrew / dupes, brew install rsync», - Matt Carrier
Стоит отметить, что --info=progress2 не работает с -v - sanmai
Добавить --no-i-r переключатель также, так rsync не сканирует инкрементно, но полностью перед копированием и знает + показывает, сколько осталось работы. - Alex
Обратите внимание, что вы можете использовать --human-readable (или -h), чтобы увидеть общий размер в MB / GB .. в процессе. - Nux


Вы можете использовать «pv» (apt-get install pv с Debian и ubuntu). Я рекомендую отслеживать количество переданных файлов, так как количество переданных данных не коррелирует с размером файлов, а в дельте между источником и получателем. И подсчет файлов будет считать тот же прогресс для одной большой дельты, а другой с небольшой дельтой. Это означает, что в любом случае оценка ETA может быть далека. ETA, основанный на размерах, работает только в том случае, если ваш пункт назначения пуст, в данном случае delta == размер источника.

Общая идея состоит в том, чтобы испускать одну строку для каждого файла, «переданного» из rsync, и подсчитывать эти строки с помощью «pv»:

rsync -ai / источник remote: / dest | pv -les [количество файлов]> / dev / null

Я имею тенденцию резервировать целые файловые системы (по нескольким причинам), в этом случае вы можете использовать гораздо более дешевые df для получения количества файлов (а не du или find которые пройдут вашу исходную иерархию в другой раз после выполнения rsync). Опция -x показывает, что rsync остается в одной исходной файловой системе (и не соответствует другим внутренним настройкам):

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

Если вы хотите считать файлы в / источнике в общем виде, используйте find /source|wc -l (предупреждение снова: может быть медленным и тяжелым для ввода-вывода).


42
2018-06-10 10:22



Как указано zerodeuz, используйте «df» только в том случае, когда вы выполняете rsyncing весь раздел, так как df -i /source получает количество inodes (файлов) из всех разделов, в которых находится / источник. В противном случае используйте «найти» для подсчета файлов внутри каталога внутри выражения «$ ()». - lepe
Альтернатива du или find - допустим, вы заканчиваете неполную копию или выполняете обновление на месте с удалением - это использовать rsync -ai --dry-run для получения того же списка файлов основной прогон будет проходить pv - Izkata


Для длительных переводов я доволен запуском du -s с обеих сторон. Даже watch -n1 du -s, если я чувствую себя очень озабоченным.

watch выполняет команду (du -s здесь) периодически (каждые 1 секунду здесь) и показывает выходной полноэкранный режим.


27
2018-01-05 16:30



Спасибо за пример watch команда! - Cam
// , Умная! Согласно linfo.org: «Команда du (т. Е. Использование диска) сообщает размеры деревьев каталогов, включая все их содержимое и размеры отдельных файлов. Это делает его полезным для отслеживания пробелов, то есть каталогов и файлов которые потребляют большое или чрезмерное пространство на жестком диске (HDD) или другом носителе ». - Nathan Basanese
Я не знаю, какие длинные переводы вы делаете, где du жизнеспособна. du медленно, как черт возьми, когда результат будет в TB и M файлов. - Nobody
Для моих «длинных передач» операция du занимает около часа, в течение которой rsync работает намного медленнее, потому что они борются за доступ к диску. - Abhi Beckert


Вместе с --info = progress2 Вы также можете отключить инкрементную рекурсию. Это приведет к созданию всего списка файлов в начале и, следовательно, даст вам лучшее представление об общем прогрессе (по крайней мере, в количестве файлов, я не думаю, что он сканирует размер файла). Есть компромисс. Это больше связано с памятью и задерживает начало фактической передачи. Вероятно, лучше всего использовать в соединениях с медленной связью и, конечно же, не очень удобно для файлов gajillions.

Ниже приведена справочная страница rsync под деталью для -r --рекурсивный

Инкрементную рекурсию можно отключить, используя --no-вкл-рекурсивная вариант или его более короткий --no-я-г псевдоним.

(источник: http://rsync.samba.org/ftp/rsync/rsync.html )

Кроме того, если вы укажете -delete-before, это приведет к полной рекурсии в начале, что необходимо для удаления файлов-сирот (файлов, которые существуют в dest, но не в источнике).


19
2017-10-16 19:56



Спасибо за это, другие ответы приводят к возрасту%, который продолжает идти вверх и вниз! - artfulrobot


В принципе нет. Вы можете показывать только прогресс в файле с помощью флага --progress, но об этом.

Я предполагаю, что вы можете написать обертку вокруг нее или использовать любые исправления, которые вы уже нашли, но вы должны спросить себя, действительно ли это стоит того, действительно ли вам нужен общий прогресс для rsync?


11
2018-01-05 15:50



Вот сценарий оболочки, который показывает общий прогресс и прогресс файла как хороший индикатор выполнения: gist.github.com/JohannesBuchner/4d61eb5a42aeaad6ce90 - j13r
Вы можете изменить способ --progress использовать работу --info=progress2, это покажет вам глобальный прогресс. Вам нужно будет отключить инкрементный рекурсивный алгоритм, чтобы он был полезен, поэтому --info=progress2 --no-inc-recursive - mat
@ j13r вы можете поделиться этим gist как ответ, как хорошо! его отличный вариант! - skywinder


Я также искал, как показать общий прогресс с помощью rsync, и я нашел полезного answser из этого сообщения: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress

В основном вы можете использовать --info = progress2 в dev-версии rsync 3.1.0, Вот что доктор сказал:

Существует также опция -info = progress2, которая выводит статистику на основе всей передачи, а не отдельных файлов. Используйте этот флаг без вывода имени файла (например, избегайте -v или укажите -info = name0, если вы хотите увидеть, как выполняется передача, не прокручивая экран с большим количеством имен. (Вам не нужно указывать - для использования --info = progress2.)


7
2017-07-04 14:30



--info=name0 это золото - Chris


Я использовал ответ от zerodeux и написал собственный скрипт 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





Я использовал ответ от zerodeux и написал собственный скрипт 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"

Я изменил сухую работу TODO на

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

Он находит количество файлов очень быстро!


6
2018-01-03 12:00



найти работы так намного лучше, чем rsync -dry-run! - hopeseekr
find работает только если вы rsyncлокально. rsync --dry-run работает с удаленными источниками ... - voretaq7