tar:file-changed-as-we-read-it报错处理

问题

在对某应用代码文件进行版本备份过程中,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 prefix no-, 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
    

分享:

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值