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

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

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

187 голосов | спросил Aron Rotteveel 5 Jpm1000000pmWed, 05 Jan 2011 18:26:12 +030011 2011, 18:26:12

17 ответов


33

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

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

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

ответил David Mackintosh 6 Jam1000000amThu, 06 Jan 2011 07:10:18 +030011 2011, 07:10:18
301

Теперь есть официальный способ сделать это в 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%, но тем не менее приятно видеть, что что-то копируется:)

Литература:

ответил Avio 24 +04002012-10-24T15:13:16+04:00312012bEurope/MoscowWed, 24 Oct 2012 15:13:16 +0400 2012, 15:13:16
42

Вы можете с '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 (предупреждение снова: может быть медленным и тяжелым для ввода-вывода).

ответил zerodeux 10 J0000006Europe/Moscow 2011, 14:22:54
27

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

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

ответил funollet 5 Jpm1000000pmWed, 05 Jan 2011 19:30:56 +030011 2011, 19:30:56
19

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

Ниже приведена справочная страница rsync под деталями для -r -recursive

  

Инкрементальная рекурсия может быть отключена с помощью параметра - не-inc-recursive или его более короткого псевдонима - no-i-r .

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

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

ответил Nate 16 +04002014-10-16T23:56:17+04:00312014bEurope/MoscowThu, 16 Oct 2014 23:56:17 +0400 2014, 23:56:17
11

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

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

ответил danakim 5 Jpm1000000pmWed, 05 Jan 2011 18:50:00 +030011 2011, 18:50:00
7

Я также искал, как показать общий прогресс с помощью 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.)

ответил Zhenyi Zhang 4 J000000Thursday13 2013, 18:30:55
7

Я использовал ответ от 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"
ответил FloHallo 8 FebruaryEurope/MoscowbWed, 08 Feb 2012 03:44:22 +0400000000amWed, 08 Feb 2012 03:44:22 +040012 2012, 03:44:22
6

Я использовал ответ от 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)

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

ответил user151779 3 Jpm1000000pmThu, 03 Jan 2013 16:00:04 +040013 2013, 16:00:04
6

Если у вас нет последнего 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

ответил Aral Balkan 2 Maypm16 2016, 12:18:41
4

Использование

lsof -ad3-999 -c rsync

Чтобы узнать, какие файлы rsync в настоящее время открыты (покажет размер файла) rsync копирует в скрытый файл локально

ответил Cloom Magoo 20 MarpmThu, 20 Mar 2014 14:20:09 +04002014-03-20T14:20:09+04:0002 2014, 14:20:09
4

Я бы сделал этот комментарий, но не имел достаточной репутации. В ответ на комментарий 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
общее количество файлов в списке файлов.
ответил Michael S 6 AMpSat, 06 Apr 2013 02:01:49 +040001Saturday 2013, 02:01:49
3

Обратите внимание на предостережение здесь, что даже --info = progress2 не является полностью надежным, поскольку этот процент основан на количестве файлов, которые rsync «знает» в момент отображения прогресса. Это не обязательно общее количество файлов, которые необходимо синхронизировать (например, если он обнаруживает большое количество больших файлов в глубоко вложенной директории). Один из способов гарантировать, что -info = progress2 не «отскочит» в индикаторе выполнения, заставит rsync сканировать все каталоги рекурсивно, прежде чем запускать синхронизацию (вместо того, чтобы по умолчанию выполнять пошаговое рекурсивное сканирование) также предоставляя опцию -no-inc-recursive. Обратите внимание, однако, что этот параметр также увеличит использование памяти rsync и время выполнения.

ответил lonetwin 25 FebruaryEurope/MoscowbTue, 25 Feb 2014 08:44:13 +0400000000amTue, 25 Feb 2014 08:44:13 +040014 2014, 08:44:13
2

Я использую скрипт, который извлекает информацию из /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
   ((Кол ++))
сделанный
эхо "----- Закончено ------------------------------------------ -------------------------»
ответил nito 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 17 Sep 2014 00:17:41 +0400 2014, 00:17:41
1

Возможно, вы можете комбинировать pv с rsync. Особенно полезен параметр - size. Взглянув на документы, что-то вроде pv --size $ (du -sb. | Awk '{print $ 1}') | rsync -av. host: /your /path должен работать.

Здесь вы найдете документы и программное обеспечение.

Не пробовал это самостоятельно.

ответил Christian 6 Jam1000000amThu, 06 Jan 2011 11:08:45 +030011 2011, 11:08:45
1

Возможно, здесь немного поздно, но будущие искатели ответов могут принести пользу.

Это тоже подслушивало меня, поэтому я подумал, что я спустился и замалчусь и напишу свой первый сценарий. Должен быть установлен пакет 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";
фи
ответил neill_L 8 Jam1000000amWed, 08 Jan 2014 04:10:47 +040014 2014, 04:10:47
1

Если ваша версия rsync не принимает параметр - info = progress2, вы можете использовать tqdm :

Для установки:

pip install tqdm

Для использования:

$ rsync -av /source /dest | tqdm --unit_scale | wc -l
10.0Mit [00:02, 3.58Mit /s]
ответил ostrokach 26 J000000Wednesday17 2017, 23:12:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132