Принудить tar игнорировать/пропускать ошибки при сжатии файлов?

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

Предположим, я делаю это tar cfzp home.tar.gz /home (занимает некоторое время) и файл изменяется во время сжатия, и tar выходит из строя, я получаю “file changed as we read it” и tar останавливается. Я предполагаю, что home.tar.gz теперь неполный, или это была просто “заметка”, а не ошибка?

Есть ли какой-то вариант “force”, чтобы заставить tar завершить работу и не прерываться на ошибках?

Редактирование/обновление: я нашел “–ignore-failed-read do not exit with nonzero on unreadable files” и, по крайней мере, кажется, что это работает. Но нужно быть осторожным с порядком параметров, потому что можно в конечном итоге получить tar файл, названный “–ignore-failed-read”.

Мне нужно игнорировать что-нибудь еще?

Обновление: Без “–ignore-failed-read” tar продолжит работу, если файл был удален “File removed before we read it”. Тем не менее, я думаю, что она может прерываться на ошибке “file changed as we read it”, но я не уверен. Трудно сравнить архив с “оригиналом”, так как у меня есть файлы кеша, которые приходят и уходят и т.д.

Обновление: При более детальном наблюдении “file changed as we read it” больше похоже на уведомление, похоже, tar продолжит, если файлы изменяются, пока tar занимается своим делом. Но я оставлю ответ открытым, может быть, кто-то более опытный добавит больше информации.

Ваше предположение верно, “File changed as we read it” это уведомление, обычно связанное с файлами, которые в использовании (т.е. в них записывается во время процесса создания) в то время как tar создает архив. Если согласованность критична, будет лучше использовать rsync для копирования содержимого в другое место, например:

rsync -avz /my/home/ /somebackupdir/my/home/  # начальная синхронизация, за которой следует
rsync -avz /my/home/ /somebackupdir/my/home/  # любая последующая синхронизация, повторяемая
                                              # так часто, как считаете нужным

Это дает вам преимущество наличия резервного места, которое нужно будет только обновлять перед созданием архива tar.

Я думаю, что правильный ответ на ваш вопрос должен быть:

Используйте tar --warning=no-file-changed, который будет подавлять только предупреждения типа "%s: file changed as we read it". Общая --ignore-failed-read может игнорировать сбои, которые вы, скорее всего, не хотите игнорировать.

Чтобы сжать несколько файлов, при этом пропуская любой отсутствующий файл:

# Этот файл существует:
> existing_file 

# Этот файл отсутствует:
rm -f deleted_file 

# Сжать, но не прерывать, если deleted_file отсутствует:
tar -cvzf archive.tar.gz $(ls deleted_file existing_file 2>/dev/null)
echo $? # код выхода 0

# Просмотр содержимого архива:
tar tvf archive.tar.gz

  -rw-rw-r-- nmanos/nmanos     0 2020-05-06 10:00 existing_file

Это ответ помог мне, спасибо! Но я не был уверен, как найти ошибку tar в моем файле журнала, состоящем из многих тысяч строк. Страница man для tar не помогла. Однако, с опозданием, основываясь на информации выше об сообщении об ошибке (“%s:”), я понял, что ключ был в использовании grep по моему журналу для ‘:’, что выдало мои ошибки (проблемы с разрешениями).

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

Использование утилиты tar для архивации и сжатия файлов в системе Linux — это одна из основных задач, с которой сталкиваются многие ИТ-специалисты. В условиях, когда файл может изменяться в процессе архивации, полезно понять, как заставить tar игнорировать подобные ошибки и продолжать выполнение своей задачи несмотря на возникновение этих ситуаций. Давайте рассмотрим теорию, примеры и прикладные советы по этой теме.

Теория

Утилита tar (сокращение от "tape archive") традиционно используется для архивации данных. Она позволяет упаковывать набор файлов и директорий в один файл-архив. Поскольку tar работает с файлами в файловой системе, во время выполнения процесса архивации файловая система может изменяться, что может привести к появлению таких предупреждений, как "файл изменен, пока мы его читали". Подобные предупреждения означают, что содержимое файла изменилось в процессе его чтения, однако это не обязательно критическая ошибка, которая должна останавливать процесс.

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

Примеры

  1. Basic Use:

    tar cfzp home.tar.gz /home

    В этом примере создается архив home.tar.gz из содержимого директории /home. Если один из файлов изменяется во время этого процесса, tar выдаст предупреждение «файл изменен, пока мы его читали».

  2. Игнорирование чтений с ошибками:

    tar --ignore-failed-read -cfzp home.tar.gz /home

    Использование опции --ignore-failed-read показывает команде tar, что она не должна завершать свою работу с ненулевым кодом выхода при возникновении ошибок чтения. Однако важно быть осторожным с порядком параметров, чтобы не создать архив с именем неправильного параметра.

  3. Подавление предупреждений об изменении файла:

    tar --warning=no-file-changed -cfzp home.tar.gz /home

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

  4. Архивация с исключением отсутствующих файлов:

    tar -cvzf archive.tar.gz $(ls deleted_file existing_file 2>/dev/null)

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

Приложение

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

Рекомендации:

  1. Использование rsync:
    Сначала скопируйте данные с помощью rsync в отдельное место:

    rsync -avz /my/home/ /somebackupdir/my/home/

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

  2. Логирование ошибок:
    Если необходимо отслеживать ошибки, возникающие в процессе создания архива, рекомендуется перенаправлять вывод команды tar в файл журнала и анализировать его на наличие ошибок:

    tar -cvzf archive.tar.gz /home 2> tar_errors.log

    Чтобы найти ошибки в большом журнале, можно использовать grep:

    grep ':' tar_errors.log

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

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

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