tar提示“file changed as we read it”本质是读取时文件被其他进程修改,属警告非错误;应通过lsof/stat确认动态写入源,再用--one-file-system、--exclude、快照或停服务等方式规避,而非简单忽略。

Linux 中 tar 归档时提示“文件发生改变”(常见如 tar: file changed as we read it 或 file is unchanged; skipping 等警告),本质是 tar 在读取过程中检测到文件内容、大小或时间戳被其他进程修改,为保证归档一致性而发出的提醒。它不是致命错误,但可能影响备份可靠性。排查需从“谁在改文件”和“如何避免干扰”两方面入手。
确认是否真有文件被动态修改
该提示通常出现在归档正在运行的日志、数据库临时文件、缓存目录等场景。可结合以下方式验证:
- 用 lsof +D /path/to/dir 查看哪些进程正在访问目标目录下的文件(尤其注意写入型进程,如 nginx、mysql、rsyslog)
- 对单个可疑文件,执行 stat filename 多次间隔几秒,观察 Modify 或 Change 时间是否变动
- 检查文件是否位于 NFS、tmpfs 或容器挂载卷等易受外部干扰的文件系统上
规避动态修改干扰的常用方法
若确认文件确实在被写入,不建议强行忽略警告(可能归档不一致),而应调整归档策略:
- 加 --one-file-system:防止跨挂载点扫描,避免意外进入被频繁写入的 /proc、/sys 或容器 overlay 目录
- 排除活跃路径:用 --exclude='*.log' --exclude='/tmp' --exclude='/var/run' 等跳过已知动态目录
- 使用快照机制:对 LVM 卷可先创建 snapshot 再归档;对 Btrfs/ZFS 可用子卷快照保证一致性
- 暂停写入服务(慎用):如归档数据库目录,应先执行 mysqldump 或停库再 tar,而非直接打包运行中的 data 目录
区分警告与真正失败
注意该提示属于 warning(黄色输出),非 error(红色)。只要 tar 进程未退出且返回码为 0(echo $? 结果为 0),说明归档完成,只是部分文件状态不稳定。可通过以下方式确认结果有效性:
- 用 tar -tzf archive.tar.gz | head -n 20 检查归档结构是否完整
- 对比源目录与解压后目录的文件数:find /src -type f | wc -l vs tar -tzf archive.tar.gz | wc -l
- 若关键文件不能容忍任何不一致,应改用 rsync + 时间戳锁定,或专用备份工具(如 duplicity、borgbackup)
这类问题不复杂但容易忽略真实诱因——重点不在压制提示,而在识别并隔离变化源。


















