tar:file-changed-as-we-read-it报错处理
(2018-03-27 11:50:44)
标签:
tarexit--warningfile-changed报错处理 |
分类: Ubuntu/Debian |
问题
在对某应用代码文件进行版本备份过程中,tar
命令报错:
/bin/tar: app/util: file changed as we read it
导致命令返回值非0,备份脚本失败退出。
分析
出现报错的是一个代码目录,目录下只有一些python脚本,以及对应的pyc中间式文件。
分析过程中发现以下情况:
- 报错的是目录而非文件
- 打包命令已经排除了pyc文件:
--exclude '*.pyc'
- 目录修改时间确实是打包命令报错的时候
- py脚本文件的修改时间是在打包命令执行前
- pyc中间式文件的修改时间有部分是打包命令报错的时候
所以初步判断,应该是在打包过程中有部分新修改的python文件被引用到,生成了新的pyc文件,
虽然打包命令已经排除了这部分pyc文件,但是对于目录来说,整个目录的内容确实已经变化了。
因为这个条件触发比较苛刻,并且需要备份的只是python文件,
同时,即使打包命令执行过程中会有这个报错提示,但实际上还是会正常生成tar包,并且也是可用的。
需要备份的文件都已正常归档到tar包,所以不准备深入研究。只需要让tar忽略这个报错就可以。
解决
翻阅tar命令手册,找到以下控制warning信息的说明:
NOTE
--warning=keyword
Control display of the warning messages identified by keyword. If keyword starts with the prefixno-
, such messages are suppressed. Otherwise, they are enabled.
需要屏蔽的是文件修改的报错:
file-changed
`%s: file changed as we read it'
所以,只需要在打包命令中增加以下参数即可:
--warning=no-file-changed
完整的打包命令类似如下:
/bin/tar --warning=no-file-changed -zcvf /path/to/bak/archive.tar.gz \
--exclude '*.pyc' --exclude .git -C /path/to/app target_dir_name
扩展
从上面的tar手册中,可以查到,tar命令的退出值会有三种情况:
0
- Successful termination.1
- Some files differ.2
- Fatal error
在返回值为1
的时候,还有以下情况
- 当使用
--compare
(--diff
,-d
) 调用tar命令的时候,表示tar包中的文件与磁盘上对应的文件不一致。 - 当使用
--create
,--append
or--update
参数时候,表示打包过程中,文件有变化,导致无法打包准确的文件内容。
所以当返回值为1
的时候,可以认为tar命令还是能够正确打包完成,
只不过可能无法包含最终准确的内容而已,可以认为这个时候tar命令结果还是正常的。
因此可以通过忽略返回值为1
的情况,参考以下信息:
-
tar: file changed as we read it
set +e tar -czf sample.tar.gz dir1 dir2 exitcode=$? if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then exit $exitcode fi set -e