Как заставить rsync продолжать работу при возникновении ошибок разрешений?

Вопрос или проблема

Я хотел бы, чтобы rsync работал более надежно с моими автоматизированными скриптами переноса файлов.

Одно, что я заметил, может заставить его остановиться посередине передачи, это такие ошибки, как

rsync: opendir "/media/slu/Solidigm/lost+found" failed: Permission denied (13)

lost+found — это директория, созданная fsck на файловых системах ext2/3/4, и не следует ожидать, что я попытаюсь изменить разрешения на подобные вещи, так как это может повлиять на работу fsck. Я также не могу отключать/вмешиваться в/настраивать специфические для Linux-дистрибутива конфигурации или автоматизации, которые заставляют fsck периодически запускаться на дисках.

Я хотел бы выяснить, может ли rsync быть убежден игнорировать и продолжать при встрече с ошибками такого типа.

Насколько мне известно, rsync не останавливается при первой ошибке, пытаясь найти или прочитать файлы на стороне источника, но он записывает сбой и в конце выдает код ошибки RERR_PARTIAL (23), чтобы указать, что не может гарантировать, что все было передано.

В руководстве не сказано это прямо, но

Если сторона отправки обнаруживает какие-либо ошибки ввода-вывода, то удаление любых файлов на целевой стороне будет автоматически отключено. Это сделано для предотвращения массового удаления файлов на целевой стороне из-за временных сбоев файловой системы (например, ошибок NFS) на стороне отправки. Вы можете переопределить это с помощью параметра –ignore-errors.

Для --delete предполагает, что это может быть единственным случаем, и с --ignore-errors директории/файлы, которые не могут быть прочитаны, будут считаться пустыми/отсутствующими и удалены на целевой стороне с --delete.

Если вам не важно, что содержимое директории lost+found не передается, вы можете исключить ее из синхронизации с помощью --exclude /path/within/the/source/to/lost+found, чтобы, если вы получите ошибку, знать, что это касается файлов, о которых вы заботитесь.

Я обнаружил, что --exclude /path/within/the/source/to/lost+found/** исключает только содержимое, но не саму директорию, это не предотвращает ошибку 23.

Если вы хотите рассматривать все файлы и директории, которые вы не можете прочитать, и все директории, которые вы не можете просмотреть, так, как будто они не существуют, вы можете составить детализированный список файлов, исключая те, которые с find, и использовать --files-from у rsync:

(
  cd -P -- "$src" &&
    find .  ! -readable -prune -o -type d ! -executable -prune -o -print0
) | rsync -av0 --files-from=- -- "$src" "$dst"

(предполагая здесь, что используется GNU find или совместимый с -readable/-executable).

Ответ или решение

Для повышения надежности автоматизированных скриптов передачи файлов с использованием rsync, важно понимать, как обрабатывать ошибки, в том числе ошибки доступа, такие как сообщения о "Permission denied". Эти ошибки могут возникать, например, при попытке доступа к директории lost+found, которая создается командой fsck на файловых системах ext2/3/4. В этой статье мы рассмотрим несколько подходов для решения этой проблемы.

Проблема с Permission denied

При выполнении команды rsync, если возникает ошибка доступа, это может привести к завершению процесса передачи файлов. Код ошибки RERR_PARTIAL (23) указывает на то, что передача не может быть завершена полностью, и это может быть связано с не доступными файлами или директориями. Важно заметить, что rsync не останавливается при первой ошибке, но фиксирует ее и продолжает выполнять остальные операции. Однако, из-за кода ошибки, передача может быть не полностью успешной.

Решения для игнорирования ошибок

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

    rsync -av --ignore-errors /path/to/source/ /path/to/destination/
  2. Исключение директории lost+found:
    Если вы хотите избежать ошибок, связанных с доступом к определенной директории, вы можете исключить ее из процесса синхронизации. Для этого используйте ключ --exclude:

    rsync -av --exclude '/media/slu/Solidigm/lost+found' /media/slu/Solidigm/ /path/to/destination/

    Это позволит вам игнорировать данную директорию, и если rsync столкнется с ошибками доступа к ней, они не будут учитываться.

  3. Фильтрация файлов с помощью find и --files-from:
    Если вам нужно более точечное управление, вы можете создать список файлов, которые доступны для передачи, и передать его в rsync с помощью ключа --files-from. Это предотвращает любые обращения к недоступным файлам:

    (
     cd -P -- "$src" &&
     find . ! -readable -prune -o -type d ! -executable -prune -o -print0
    ) | rsync -av --files-from=- -- "$src" "$dst"

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...