Вопрос или проблема
Я хотел бы, чтобы 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
не останавливается при первой ошибке, но фиксирует ее и продолжает выполнять остальные операции. Однако, из-за кода ошибки, передача может быть не полностью успешной.
Решения для игнорирования ошибок
-
Использование ключа
--ignore-errors
:
Для того чтобы игнорировать ошибки доступа и продолжать синхронизацию, вы можете использовать ключ--ignore-errors
. Этот ключ предотвращает остановку передачи из-за временных ошибок ввода-вывода и позволяетrsync
продолжать выполнение операций:rsync -av --ignore-errors /path/to/source/ /path/to/destination/
-
Исключение директории
lost+found
:
Если вы хотите избежать ошибок, связанных с доступом к определенной директории, вы можете исключить ее из процесса синхронизации. Для этого используйте ключ--exclude
:rsync -av --exclude '/media/slu/Solidigm/lost+found' /media/slu/Solidigm/ /path/to/destination/
Это позволит вам игнорировать данную директорию, и если
rsync
столкнется с ошибками доступа к ней, они не будут учитываться. -
Фильтрация файлов с помощью
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
, вы сможете настроить вашу систему так, чтобы она обрабатывала ошибки более эффективно и продолжала свою работу без лишних прерываний. Важно понимать, что каждый из этих методов имеет свои преимущества и недостатки, и лучший выбор будет зависеть от специфики вашей задачи.