rsync может возобновиться, будучи прерванным?

Вот объединение решения find и ed.

add_header() {
   declare regex IFS='|'
   (( $# )) && regex="^($*)$" || regex=""
   find "$PWD" -type f -exec bash -c ' 
      ( exec grep -E -qs -e "$0" <<<"${1##*/}" ) || exit
      _dirname="${1%/*}"
      _dirname="${_dirname##*/}"
      exec ed -s "${1}" <<EOF
0a
# Student: ${_dirname}
.
wq
EOF
   ' "${regex:-.+}" '{}' \;
   return 0
}

add_header                    # all files in current directory recursively
add_header file1 file2 file3  # only named files in current directory recursively
196
29.07.2014, 21:38
8 ответов

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

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

Если Вы используете ssh, чтобы войти в другую систему и скопировать файлы,

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

сообщите мне, существует ли ошибка в моем понимании этого понятия...

1
27.01.2020, 19:27
  • 1
    Можно ли отредактировать ответ и объяснить ли, что специальный вызов ssh делает, и почему Вы совет сделать это? –  Fabien 14.06.2013, 15:12
  • 2
    @Fabien Он говорит rsync устанавливать две ssh опции (rsync использует ssh для соединения). Второй говорит ssh не запрашивать подтверждение, если хост, с которым он соединяется, не уже известен (существующим в "известных хостах" файл). Первый говорит ssh не использовать значение по умолчанию известный файл hosts (который был бы ~/.ssh/known_hosts). Он использует/dev/null вместо этого, который, конечно, всегда пуст, и поскольку ssh затем не нашел бы хост там, он будет обычно запрашивать подтверждение, следовательно опция два. После соединения ssh пишет теперь известный хост/dev/null, эффективно забывая это немедленно :) –  DanielSmedegaardBuus 07.12.2014, 02:12
  • 3
    ..., но Вы, вероятно, задавались вопросом, какой эффект, если таковые имеются, он имеет на саму rsync операцию. Ответ не ни один. Это только служит, чтобы не иметь хост, Вы подключаете к добавленному к Вашему SSH известный файл hosts. Возможно, он - системный администратор, часто соединяющийся с большим количеством новых серверов, временных систем или этажерки. Я не знаю :) –  DanielSmedegaardBuus 07.12.2014, 02:23
  • 4
    "использование - опция прогресса скопировать только те файлы, которые не копируются" Что? –  moi 10.05.2016, 16:49
  • 5
    Ядра Fedora, существуют пара ошибок здесь; каждый очень серьезен: --delete удалит файлы в месте назначения, которые не существуют в источнике. Менее серьезный - это --progress не изменяет, как копируются вещи; это просто дает Вам отчет о выполнении работ на каждом файле, поскольку это копирует. (Я зафиксировал серьезную ошибку; замененный это --remove-source-files.) –  Paul d'Aoust 18.11.2016, 00:39

-P Вы можете добавить опцию -P к вашей команде.

Со страницы man:

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

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

Так что вместо:

sudo rsync -azvv /home/path/folder1/ /home/path/folder2

Do:

sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

Конечно, если вам не нужны обновления прогресса, вы можете просто использовать -частичное, т.е.:

sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
39
27.01.2020, 19:27

TL;DR:

Просто укажите частичный каталог, как рекомендует rsync man pages:

--partial-dir=.rsync-partial

Более длинное объяснение:

На самом деле существует встроенная возможность сделать это с помощью опции --partial-dir, которая имеет несколько преимуществ перед альтернативами --partial и --append-verify/--append.

Выдержка из руководства rsync:

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

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

  1. Ваши файлы резервного копирования могут быть неполными, и без проверки удаленного файла, который должен быть все еще неизменен, нет способа узнать это.

  2. Если вы пытаетесь использовать --backup и --backup-dir, вы только что добавили в историю версий новую версию этого файла, который до этого даже не выходил.

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

63
27.01.2020, 19:27

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

При передаче файлов они временно сохраняются как скрытые файлы в своих целевых папках (например, .TheFileYouAreSending.lRWzDC ) или в специально выбранной папке, если вы устанавливаете - partial-dir переключатель. Если передача не удалась и - частичный не установлен, этот скрытый файл останется в целевой папке под этим загадочным именем, но если установлено - частичное , файл будет переименовано в фактическое имя целевого файла (в данном случае TheFileYouAreSending ), даже если файл не является полным. Дело в том, что позже вы можете завершить передачу, снова запустив rsync с помощью - append или - append-verify .

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

Что касается упомянутого выше переключателя - append , это фактический переключатель «возобновления», и вы можете использовать его независимо от того, используете вы также - partial ]. Фактически, когда вы используете - append , никакие временные файлы никогда не создаются. Файлы записываются прямо в свои целевые объекты. В этом отношении - append дает тот же результат, что и - partial при неудачной передаче, но без создания этих скрытых временных файлов.

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

Как указывает @Alex ниже, начиная с версии 3.0.0 rsync теперь имеет новый параметр - append-verify , который ведет себя как - append до того, как существовал этот переключатель. Вероятно, вам всегда нужно поведение - append-verify , поэтому проверьте свою версию с помощью rsync --version .Если вы работаете на Mac и не используете rsync из homebrew , у вас (по крайней мере, до El Capitan включительно) будет более старая версия, и вам нужно будет использовать --append вместо - append-verify . Почему они не сохранили поведение на -append и вместо этого назвал новичка - append-no-verify немного озадачивает. В любом случае, - добавление в rsync перед версией 3 такое же, как - append-verify в более новых версиях.

- append-verify не опасен: он всегда будет читать и сравнивать данные на обоих концах, а не просто предполагать, что они равны. Он делает это с использованием контрольных сумм, поэтому это легко в сети, но для этого требуется прочитать общий объем данных на обоих концах провода, прежде чем он сможет фактически возобновить передачу, добавив к цели.

Во-вторых, вы сказали, что «слышали, что rsync может находить различия между источником и местом назначения и, следовательно, просто копировать различия».

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

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

Примечательно, что если вы используете - контрольную сумму для передачи пакета файлов, совершенно новых для целевой системы, rsync все равно будет вычислять их контрольные суммы в исходной системе перед их передачей. Почему я не знаю :)

Итак, вкратце:

Если вы часто используете rsync, чтобы просто «перемещать данные из A в B» и хотите отменить эту операцию, а затем возобновить ее, не используйте - контрольную сумму , но используйте используйте - append-verify .

Если вы часто используете rsync для резервного копирования, использование - append-verify , вероятно, мало что вам даст, если только у вас нет привычки отправлять большие файлы, размер которых постоянно увеличивается. по размеру, но редко изменяются после написания. В качестве бонуса: если вы выполняете резервное копирование в хранилище, поддерживающее моментальные снимки, например btrfs или zfs , добавление переключателя - inplace поможет вам уменьшить размеры снимков, поскольку измененные файлы не воссоздаются, а измененные блоки записываются непосредственно поверх старых. Этот переключатель также полезен, если вы не хотите, чтобы rsync создавал копии файлов на целевом компьютере, когда произошли только незначительные изменения.

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

ОБНОВЛЕНО 01.09.2015 Изменено, чтобы отразить замечания, сделанные @Alex (спасибо!)

ОБНОВЛЕНО 14.07.2017 Изменено, чтобы отразить замечания, сделанные @Jonathan (спасибо!)

301
27.01.2020, 19:27

Я использую этот простой скрипт. Не стесняйтесь настраивать определенные флаги и/или параметризовать их.

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial [source] [dest]:
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying in 180 s..."
        sleep 180
    fi
done

Перед запуском скрипта вы должны заменить [source]и [dest]своими фактическими значениями.

1
27.01.2020, 19:27

Поздно пришел к этому, но у меня был тот же вопрос, и я нашел другой ответ.

Флаг --partial(«сохранять частично переданные файлы» вrsync -h)полезен для больших файлов, как и--append(«добавлять данные в более короткие файлы» ), но вопрос касается большое количество файлов.

Чтобы исключить файлы, которые уже были скопированы, используйте-u(или--update:"пропустить более новые файлы на приемнике" ).

5
27.01.2020, 19:27

Для тех, кто использует графический интерфейс Grsync, соответствующая конфигурация выглядит следующим образом:

Во вкладке «Дополнительные параметры» установите (не менее )флажок «Сохранить частично переданные файлы ».

Затем в поле «Дополнительные параметры» введите:

--append-verify

Затем Файл-> Моделирование :, чтобы проверить, будет ли передача работать (, если вы столкнулись с ошибкой, вы можете проверить другие выбранные параметры, источник и место назначения ).
И, наконец, Файл-> Выполнить .

С этой конфигурацией, если передача не удалась, вы можете просто закрыть окно передачи и Файл-> Выполнить еще раз. Он возобновит передачу с того места, где она была прервана.

0
23.03.2021, 16:21

Несколько важных правил:

  1. rsyncиспользуйте дельта-алгоритм -xfer, чтобы определить, будут ли повторно отправляться блоки, отличающиеся друг от друга, за исключением опции -W, --whole-file.
  2. rsyncзапишет данные во временный каталог и переместит их в место назначения по завершении, за исключением опции --inplace.
  3. когда дельта -xfer включен, если вы хотите пропустить вычисление контрольной суммы блоков частично отправленных данных, вы можете добавить опцию --append,но идентичность частичных отправленных данных должна быть обеспечена вами самостоятельно.
  4. --appendвлечет --inplace, что само по себе влечет--partial

В моем случае я хочу отправлять добавочные файлы без чрезмерной нагрузки на ЦП и диск, команда

rsync -avPL --inplace --append --bwlimit 30m -e 'ssh -o StrictHostKeyChecking=no' <src> <dst>
1
25.06.2021, 02:16

Теги

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