假设我这样做tar cfzp home.tar.gz /home
(需要一段时间),压缩过程中文件发生变化,tar 失败,我收到“文件在读取时发生更改”的消息,然后 tar 停止。我猜想 home.tar.gz 现在不完整,或者那只是“通知”,而不是真正的错误?
是否有某种“强制”选项可以使 tar 完成其工作并且不会因错误而中止?
编辑/更新:我发现“--ignore-failed-read 在无法读取文件时不会以非零值退出”,至少我认为它是有效的。但需要小心参数的顺序,因为您最终可能会得到一个名为“--ignore-failed-read”的 tar 文件
我还需要忽略其他什么吗?
更新:如果没有“--ignore-failed-read”,tar 将继续运行,如果文件已被删除“文件在我们读取之前被删除”。但是,我认为它可能会因“文件在我们读取时被更改”错误而中止,但我真的不知道。很难将存档与“原始”进行比较,因为我有来来去去的缓存文件等。
更新:经过仔细观察,“文件在我们读取时发生更改”更像是一个通知,如果文件在 tar 执行其任务时发生更改,tar 似乎会继续运行。但我不回答这个问题,也许更有经验的人可以提供更多见解。
答案1
您的假设是正确的,“文件在我们读取时发生更改”是一个通知,通常与 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
这样,您便可以获得一个备份位置,在创建 tarball 之前,仅需更新差异即可。
答案2
我认为你的问题的正确答案应该是:
使用tar --warning=no-file-changed
只会抑制 类型的警告"%s: file changed as we read it"
。一般情况下,--ignore-failed-read
可能会忽略您不想忽略的失败。
答案3
要压缩多个文件,跳过任何缺失的文件:
# 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
答案4
这个答案对我有帮助,谢谢!但我不确定如何在包含数千行的日志文件中查找 tar 错误。tar 的手册页没有帮助。然而,后来,根据上面关于错误消息(“%s:”)的信息,我意识到关键是在我的日志中 grep ':',它会吐出我的错误(权限问题)。