Скажем, я делаю это tar cfzp home.tar.gz /home
(занимает некоторое время) и файл изменяется во время сжатия и tar терпит неудачу, я получаю «файл изменяется по мере его чтения», и tar останавливается. Я предполагаю, что home.tar.gz теперь неполный, или это было просто "уведомление", а не ошибка?
Есть ли какая-то «принудительная» опция, чтобы tar завершал свою работу и не прерывался при ошибках?
Редактировать / обновить: я обнаружил, что «--ignore-failed-read не завершает работу с ненулевым значением для нечитаемых файлов», и, по крайней мере, я думаю, что это работает. Но нужно быть осторожным с порядком параметров, потому что вы можете получить tar-файл с именем "--ignore-failed-read"
Мне нужно игнорировать что-нибудь еще?
Обновление: без «--ignore-failed-read» tar продолжит работу, если файл был удален «Файл удален до того, как мы его прочитаем». Однако я думаю, что это могло прерваться из-за ошибки «файл изменен при чтении», но я точно не знаю. Трудно сравнить архив с «оригиналом», так как у меня есть файлы кеша, которые приходят и уходят и т.
Обновление: при более внимательном рассмотрении «файл изменяется по мере его чтения» больше похоже на уведомление, похоже, tar продолжит работу, если файлы изменятся, пока tar выполняет свою работу. Но я оставлю ответ открытым, возможно, кто-то более опытный сможет добавить больше информации.
Ваше предположение верно: «Файл изменен при его чтении» - это уведомление, обычно связанное с используемыми файлами (т.е. записанными в процессе создания), когда tar создает архив. Если согласованность жизненно важна, вам лучше синхронизировать содержимое в другом месте, т.е.
rsync -avz /my/home/ /somebackupdir/my/home/ # initial sync, followed by
rsync -avz /my/home/ /somebackupdir/my/home/ # any subsequent sync, repeated
# as often as you feel necessary
Это дает вам преимущество наличия резервной копии, в которой нужно будет только обновить различия перед созданием архива.
Думаю, правильный ответ на ваш вопрос должен быть таким:
Использовать tar --warning=no-file-changed
который подавляет только предупреждения "%s: file changed as we read it"
. Генерал --ignore-failed-read
может игнорировать сбои, которые вы не хотели бы игнорировать.
Для сжатия нескольких файлов, пока пропуск любого отсутствующего файла:
# This file exists:
> existing_file
# This file is missing:
rm -f deleted_file
# Compress but don't fail if deleted_file is missing:
tar -cvzf archive.tar.gz $(ls deleted_file existing_file 2>/dev/null)
echo $? # exit code is 0
# List archive content:
tar tvf archive.tar.gz
-rw-rw-r-- nmanos/nmanos 0 2020-05-06 10:00 existing_file