Показывать общий прогресс в rsync: возможно ли это?
Я уже искал эту опцию, но нашел решения, которые включают пользовательское исправление . Тот факт, что он не отображается в --help и не может быть больше информации, вероятно, указывает, что ответы «нет», но я хотел бы, чтобы это подтвердилось.
Можно ли показать общий ход передачи файлов с помощью rsync?
17 ответов
Данаким правильный. Нет никаких тривиальных способов добавить общий индикатор прогресса.
Причиной этого является то, что когда rsync просматривает список файлов для синхронизации, он заранее не знает, какие файлы нужно будет изменить. Если вы выполняете дельта-переводы, сами дельта должны быть рассчитаны заблаговременно, чтобы дать общую картину работы, которая должна быть выполнена.
Другими словами, самый простой способ подсчитать, сколько работы нужно сделать, это на самом деле сделать это.
Теперь есть официальный способ сделать это в rsync (версия 3.1.0, версия протокола 31, протестированная с Ubuntu Trusty 14.04).
# > ./rsync -a -info = progress2 /usr.
305,002,533 80% 65,69 МБ /с 0:00:01 xfr # 1653, ir-chk = 1593/3594)
Я пробовал с моей папкой /usr
, потому что мне нужна эта функция для трансляции целых файловых систем, а /usr
показалась хорошей репрезентативной выборкой.
- info = progress2
дает хороший общий процент, даже если это просто частичное значение. Фактически, моя папка /usr
имеет более 6 концертов:
# > du -sh /usr
6,6G /usr /
и rsync
потребовалось много времени, чтобы просмотреть все. Таким образом, почти все время процент, который я видел, составлял около 90%, но тем не менее приятно видеть, что что-то копируется:)
Литература:
Вы можете с '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
(предупреждение снова: может быть медленным и тяжелым для ввода-вывода).
Для длинных переводов я доволен запуском du -s
с обеих сторон. Даже watch -n1 du -s
, если я очень беспокоюсь.
watch
выполняет команду (du -s
здесь) периодически (каждую секунду здесь) и показывает полный полноэкранный вывод.
Наряду с - info = progress2 Вы также можете отключить инкрементную рекурсию. . Это приведет к созданию всего списка файлов в начале и, следовательно, даст вам лучшее представление о общий прогресс (по крайней мере, в количестве файлов, я не думаю, что он сканирует размер файла). Есть компромисс. Это больше связано с памятью и задерживает начало фактической передачи. Вероятно, лучше всего использовать в соединениях с медленной связью и, конечно же, не очень удобно для файлов gajillions.
Ниже приведена справочная страница rsync под деталями для -r -recursive
Инкрементальная рекурсия может быть отключена с помощью параметра - не-inc-recursive или его более короткого псевдонима - no-i-r .
(источник: http://rsync.samba.org/ftp/rsync/rsync .html )
Кроме того, если вы укажете -delete-before, это приведет к полной рекурсии в начале, что необходимо для удаления файлов-сирот (файлы, которые существуют в dest, но не в источнике).
В принципе нет. Вы можете показывать только прогресс в файле с помощью флага --progress, но об этом.
Я предполагаю, что вы можете написать обертку вокруг нее или использовать любые исправления, которые вы уже нашли, но вы должны спросить себя, действительно ли это стоит того, действительно ли вам нужен общий прогресс для rsync?
Я также искал, как показать общий прогресс с помощью rsync, и я нашел полезный answser из этого сообщения: https://stackoverflow.com/questions/7157973/monitoring-rsync-progress
В основном вы можете использовать - info = progress2 в dev-версии rsync 3.1.0 . Вот что сказал doc :
Существует также опция -info = progress2, которая выводит статистику на основе всей передачи, а не отдельных файлов. Используйте этот флаг без вывода имени файла (например, избегайте -v или укажите -info = name0, если вы хотите увидеть, как выполняется передача, не прокручивая экран с большим количеством имен. (Вам не нужно указывать - для использования --info = progress2.)
Я использовал ответ от zerodeux и написал собственный скрипт bash:
#! /Bin /Баш
RSYNC = "ionice -c3 rsync"
# не использовать --progress
RSYNC_ARGS = "- vrltD --delete --stats --human-readable"
SOURCES = "/dir1 /dir2 /file3"
TARGET = "хранение :: хранение"
echo "Выполнение сухих пробегов, чтобы посмотреть, сколько файлов необходимо передать ..."
TODO = $ ($ {RSYNC} --dry-run $ {RSYNC_ARGS} $ {ИСТОЧНИКИ} $ {TARGET} | grep "^ Количество переданных файлов" | awk '{print $ 5}')
$ {RSYNC} $ {RSYNC_ARGS} $ {ИСТОЧНИКИ} $ {TARGET} | pv -l -e -p -s "$ TODO"
Я использовал ответ от zerodeux и написал свой собственный маленький скрипт BASH:
#! /Bin /Баш
RSYNC = "ionice -c3 rsync"
# не использовать --progress
RSYNC_ARGS = "- vrltD --delete --stats --human-readable"
SOURCES = "/dir1 /dir2 /file3"
TARGET = "хранение :: хранение"
#echo "Выполнение сухих пробегов, чтобы посмотреть, сколько файлов необходимо передать ..."
TODO = $ (найти $ {SOURCES} | wc -l)
$ {RSYNC} $ {RSYNC_ARGS} $ {ИСТОЧНИКИ} $ {TARGET} | pv -l -e -p -s "$ TODO"
Я изменил сухую работу TODO на
TODO = $ (find $ {SOURCES} | wc -l)
Он быстро находит количество файлов!
Если у вас нет последнего rsync (например, OS X имеет 2,6,9) и canâ € ™ t использовать - info = progress2
, вот еще одна альтернатива для сохранения себя со страниц прокрутки текста о прогрессе:
rsync -aPh <source> & Lt; & назначения GT; | xargs -L1 printf "\ 33 [2K \ rTransferring:% s"
Это будет печатать в одной строке имя последнего передаваемого файла:
Перенос: the-latest.file
Использование
lsof -ad3-999 -c rsync
Чтобы узнать, какие файлы rsync в настоящее время открыты (покажет размер файла) rsync копирует в скрытый файл локально
Я бы сделал этот комментарий, но не имел достаточной репутации. В ответ на комментарий naught101 к выбранному ответу параметр -progress показывает, сколько файлов было перенесено из общей суммы для передачи. Я не понимал этого, пока не посмотрел на этот пост и не посмотрел на результат более тщательно.
Статистика «to-check» показывает, сколько файлов осталось от общего числа. Это наиболее полезно при повторном подключении к новому месту назначения, чтобы вы знали, что все файлы будут полностью скопированы.
На странице man:
Когда завершается передача файла [each], rsync заменяет
строка прогресса с итоговой строкой, которая выглядит так:
1238099 100% 146,38kB /s 0:00:08 (xfer # 5, to-check = 169/396)
В этом примере файл имел длину 1238099 байтов
общая, средняя скорость передачи для всего файла
было 146,38 килобайта в секунду за 8 секунд, что
потребовалось завершить, это был 5-й перевод регу-
lar во время текущего сеанса rsync, и там
еще 169 файлов для проверки получателя (чтобы узнать,
они обновлены или нет), оставшиеся из 396
общее количество файлов в списке файлов.
Обратите внимание на предостережение здесь, что даже --info = progress2 не является полностью надежным, поскольку этот процент основан на количестве файлов, которые rsync «знает» в момент отображения прогресса. Это не обязательно общее количество файлов, которые необходимо синхронизировать (например, если он обнаруживает большое количество больших файлов в глубоко вложенной директории). Один из способов гарантировать, что -info = progress2 не «отскочит» в индикаторе выполнения, заставит rsync сканировать все каталоги рекурсивно, прежде чем запускать синхронизацию (вместо того, чтобы по умолчанию выполнять пошаговое рекурсивное сканирование) также предоставляя опцию -no-inc-recursive. Обратите внимание, однако, что этот параметр также увеличит использование памяти rsync и время выполнения.
Я использую скрипт, который извлекает информацию из /proc //io для процесса rsync (или любой другой процесс, если на то пошло), и зная, какая общая сумма будет передана, вычисляет прогресс.
#! /Bin /Баш
Применение()
{
echo ": $ 0 PASE BASEMSIZE [DELAY [s | m | h]]"
}
если [$ # -lt 2]; тогда
Применение
выход 1
elif [$ # -eq 3]; тогда
DELAY = $ 3
еще
DELAY = 5s
фи
PID = $ 1
PBASE = `echo 'scale = 2; $ 2/1024" | bc`
R_PID = $ PID
W_PID = $ PID
R_SPEED_MAX = 0
W_SPEED_MAX = 0
R_SPEED_CUM = 0
W_SPEED_CUM = 0
R_SPEED_AVG = 0
W_SPEED_AVG = 0
ЕТ = 0
ETA_H = 0
ETA_M = 0
ETA_S = 0
в то время как [ ! -r /proc /$ PID /io];
делать
Чисто
echo "Ожидание процесса с PID = $ PID для появления!"
спать 1
сделанный
B_READ_PREV = `cat /proc /$ R_PID /io | awk '$ 1 ~ /^ read_bytes /{print $ 2}'`
B_WRITE_PREV = `cat /proc /$ W_PID /io | awk '$ 1 ~ /^ write_bytes /{print $ 2}'`
T1 = `date +% s.% N`
кол = 0
тогда как true
делать
[! -r /proc /$ PID /io] & & & ломать
Чисто
B_READ = `cat /proc /$ R_PID /io | awk '$ 1 ~ /^ read_bytes /{print $ 2}'`
B_WRITE = `cat /proc /$ W_PID /io | awk '$ 1 ~ /^ write_bytes /{print $ 2}'`
BL_READ = `echo 'scale = 2; ($ B_READ- $ B_READ_PREV) /1048576" | bc`
BL_WRITE = `echo 'scale = 2; ($ B_WRITE- $ B_WRITE_PREV) /1048576" | bc`
GB_DONE = `echo 'scale = 2; $ B_WRITE /1073741824" | bc`
PDONE = `echo 'scale = 2; $ GB_DONE * 100 /$ PBASE" | bc`
T2 = `date +% s.% N`
TLOOP = `echo 'scale = 2; ($ T2- $ T1) /1" | bc`
R_SPEED = `echo 'scale = 2; $ BL_READ /$ TLOOP" | bc`
W_SPEED = `echo 'scale = 2; $ BL_WRITE /$ TLOOP" | bc`
если [$ count -ge 1]; тогда
R_SPEED_CUM = `echo 'scale = 2; $ R_SPEED_CUM + $ R_SPEED" | bc`
R_SPEED_AVG = `echo 'scale = 2; $ R_SPEED_CUM /$ count" | bc`
W_SPEED_CUM = `echo 'scale = 2; $ W_SPEED_CUM + $ W_SPEED" | bc`
W_SPEED_AVG = `echo 'scale = 2; $ W_SPEED_CUM /$ count" | bc`
[`echo" scale = 2; $ W_SPEED> $ W_SPEED_MAX "| bc` -eq 1] & & & & W_SPEED_MAX = $ W_SPEED
[`echo 'scale = 2; $ R_SPEED> $ R_SPEED_MAX" | bc` -eq 1] & & & & R_SPEED_MAX = $ R_SPEED
фи
если [`echo" scale = 2; $ W_SPEED_AVG> 0 "| bc` -eq 1]; тогда
ETA = `echo 'scale = 2; (($ PBASE- $ GB_DONE) * 1024) /$ W_SPEED_AVG" | bc`
ETA_H = `echo 'scale = 0; $ ETA /3600" | bc`
ETA_M = `echo 'scale = 0; ($ ETA% 3600) /60" | bc`
ETA_S = `echo 'scale = 0; ($ ETA% 3600)% 60" | bc`
фи
echo "Мониторинг PID: $ PID"
эхо
echo "Читать: $ BL_READ MiB в $ TLOOP s"
echo "Запись: $ BL_WRITE MiB в $ TLOOP s"
эхо
echo "Скорость чтения: $ R_SPEED MiB /s (Среднее: $ R_SPEED_AVG, Max: $ R_SPEED_MAX)"
echo "Скорость записи: $ W_SPEED MiB /s (Avg: $ W_SPEED_AVG, Max: $ W_SPEED_MAX)"
эхо
echo "Done: $ GB_DONE GiB /$ PBASE GiB ($ PDONE%)"
[`echo 'scale = 2; $ ETA> 0" | bc` -eq 1] & & & printf "ETA:% 02d:% 02d:% 05.2f (% .2fs) \ n" $ ETA_H $ ETA_M $ ETA_S $ ETA
echo "Истек:` ps -p $ PID -o etime = `"
T1 = `date +% s.% N`
sleep $ DELAY
B_READ_PREV = $ B_READ
B_WRITE_PREV = $ B_WRITE
((Кол ++))
сделанный
эхо "----- Закончено ------------------------------------------ -------------------------»
Возможно, вы можете комбинировать pv
с rsync. Особенно полезен параметр - size
. Взглянув на документы, что-то вроде pv --size $ (du -sb. | Awk '{print $ 1}') | rsync -av. host: /your /path
должен работать.
Здесь вы найдете документы и программное обеспечение.
Не пробовал это самостоятельно.
Возможно, здесь немного поздно, но будущие искатели ответов могут принести пользу.
Это тоже подслушивало меня, поэтому я подумал, что я спустился и замалчусь и напишу свой первый сценарий. Должен быть установлен пакет zenity (sudo apt-get install zenity), но я уверен, что он, вероятно, уже будет там. Кроме того, я использую wmctrl (диспетчер оконных менеджеров), чтобы изменить заголовок диалога прогресса, когда это будет сделано, оно легко устанавливается, но не изменит ситуацию, если вы этого не сделаете. Мне просто нравится видеть, когда это делается в моей панели.
Сценарий в основном запрашивает исходный и целевой каталог, вычисляет процент назначения из источника по размеру с помощью du и отображает индикатор выполнения.
Примечание. Это работает только для полной синхронизации каталогов /файлов (обычно я использую его для создания резервных копий кэша apt), поэтому параметр no --exclude = /file /in /Source-directory. Также не будет работать, если файлы /каталоги находятся в каталоге назначения не в исходном каталоге. Я не уверен, работает ли это для удаленных источников /получателей, потому что у меня не было необходимости в этом или ресурсов для его проверки.
PS. Этот скрипт может быть очень плохо написан или очень неэффективен (здесь скрипт-девственник), но, по крайней мере, он служит своей цели и, конечно же, вы можете редактировать и улучшать его в соответствии с вашими потребностями. PSS. Кроме того, не удалось получить кнопку отмены, чтобы убить rsync, поэтому я просто удалил ее.
#! /bin /bash
set -e;
WELC = «Запуск RsyncP в качестве USER»;
функция echo_progress ()
{
while (($ TRANSFER_SIZE> 1000));
делать
DEST_SIZE = $ (du -s $ DEST_FOLDER | cut -d /-f 1);
((TRANSFER_SIZE = $ SOURCE_SIZE-dest_size));
PROGRESS_PERC = $ ((dest_size * 100 /SOURCE_SIZE));
echo $ PROGRESS_PERC;
сон 0,1 с;
сделанный;
эхо 100;
zenity --info --width = 250 --title = RsyncP --text = "Синхронизация файлов завершена!";
}
функция get_input ()
{
dirs = $ (zenity -forms --width = 500 --title = "RsyncP" --text = "Введите исходные и целевые каталоги" --add-entry = "Источник:" --add-entry = "Назначение: "--separator =" ");
SOURCE_FOLDER = $ (echo $ dirs | cut -d '' -f 1);
DEST_FOLDER = $ (echo $ dirs | cut -d '' -f 2);
OPTIONS = - $ (zenity --list --title = "Параметры RsyncP" --text = "Выбрать параметры rsync" --separator = '' --height = 470 --width = 470 --checklist --column "активировать "--column" Option "--column" Описание "FALSE v" Verbose (только для терминала) "FALSE q" Тихие, недопустимые сообщения без ошибок (только для терминала) Прогресс FALSE P (только для терминала) FALSE a Архив (lrpog) «TRUE r» Записаться в директории «FALSE p» Сохранять разрешения «FALSE o» Сохранить владельца «FALSE g» Сохранить группу «FALSE l» Скопировать символические ссылки как символические ссылки »);
zenity --question --no-wrap --title = "RsyncP" --width = 500 --text = "rsync $ OPTIONS $ SOURCE_FOLDER $ DEST_FOLDER \ nВы хотите продолжить?";
SOURCE_SIZE = $ (du -s $ SOURCE_FOLDER | cut -d /-f 1);
DEST_SIZE = $ (du -s $ DEST_FOLDER | cut -d /-f 1);
PROGRESS_PERC = $ ((dest_size * 100 /SOURCE_SIZE));
TRANSFER_SIZE = 1001;
}
если ["$ (id -u)"! = "0"]; тогда
zenity --question --title = RsyncP --text = "$ WELC, Продолжить?";
get_input;
rsync $ ОПЦИИ $ SOURCE_FOLDER $ DEST_FOLDER &
echo_progress | zenity --progress --title = RsyncP --no-cancel --auto-close --text = "Копирование из \ n $ SOURCE_FOLDER в \ n $ DEST_FOLDER";
еще
zenity --question --title = RsyncP --text = "$ WELC, Продолжить?";
get_input;
sudo rsync $ ОПЦИИ $ SOURCE_FOLDER $ DEST_FOLDER &
echo_progress | zenity --progress --title = RsyncP --no-cancel --auto-close --text = "Копирование из \ n $ SOURCE_FOLDER в \ n $ DEST_FOLDER";
фи