67

Я написал небольшой скрипт, который копирует и сжимает список каталогов + файлов.

Сценарий, по-видимому, успешно выполняется, поскольку после запуска сценария создается полезный файл .tar.gz.

Тем не менее, я получаю это надоедливое сообщение после завершения скрипта:

tar: выход с состоянием ошибки из-за предыдущих ошибок

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

Каковы возможные причины появления этого сообщения об ошибке / предупреждения, и могу ли я смело его игнорировать? Если я не могу игнорировать это, каковы шаги для диагностики и устранения ошибки?

Я работаю на Ubuntu 10.0.4

7 ответов7

87

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

20

проблема в аргументе, в качестве аргумента f аргумент f принимает имя файла, поэтому он должен быть последним аргументом

tar cvzf output.tgz folder

или же

tar -cvzf output.tgz folder

то же самое и не принимать ошибку.

5

Иногда при резервном копировании файлов, которые могут изменяться во время резервного копирования, таких как файлы журналов, вам может быть полезен параметр tar '--ignore-failed-read' (я работаю в Debian Linux, не уверен, что он не относится к gnu tar).

Стандартный вывод и ошибка могут быть перенаправлены в 2 разных файла что-то вроде:

LOGDIR='/var/log/mylogdir' 
LOG=${LOGDIR}/backup.log 
ERRLOG=${LOGDIR}/backup.error.log 
DATE=$(date +%Y-%m-%d)
HOSTNAME=$(hostname)
DATA_DIRS='/etc /home /root'

tar --ignore-failed-read -f ${BACKUP_DIR}/${HOSTNAME}-${DATE}.tgz -cvz ${DATA_DIRS} > $LOG 2> $ERRLOG

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

3

У меня возникла та же проблема, и ни один из приведенных выше ответов не помог мне. Однако я обнаружил, что работает следующая команда:

tar -cpzf /backups/fullbackup.tar.gz --exclude=backups --exclude=proc --exclude=tmp --exclude=mnt --exclude=sys --exclude=dev --exclude=run /

Ошибки, на которые ссылались в tar: Exiting with failure status due to previous errors можно определить, отключив опцию -v. После проверки ошибки пришли из каталогов вроде /run и /sys .

Исключая эти каталоги, он работает просто отлично. Надеюсь, что это поможет любому с подобной проблемой.

3

У меня такая же проблема. Все, что я сделал, это удалил черту ("-") из команды.

Вместо того, чтобы печатать как

tar -cvfz output.tar.gz folder/

попробуйте ввести это как

папка tar cvfz output.tar.gz /

Я не знаю, почему черта вызывала проблемы в моем случае, но по крайней мере это работало.

1

Вы неправильно поняли предыдущий ответ. Проблема не в - , это где f находится в вашем списке аргументов.

tar cvfz target.tgz <files>

Постараюсь создать архив с именем "z", так как это текст после f . Сообщение об ошибке вызвано тем, что tar не может найти "target.gz" для добавления в архив "z".

tar cvzf target.tgz <files>

Будет правильно создавать target.tgz и добавлять в него файлы. Это потому, что target.tgz является первым текстом после аргумента f .

0

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

Вы уверены, что не видите никаких файлов преступников? Попробуйте с помощью tar cvfz yourtarball.tgz /your/path

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .