关于AWS S3 Sync复制未关闭文件及SFTP同步场景的技术咨询
AWS S3 Sync 对未关闭/传输中文件的处理逻辑
刚好对这个场景很熟悉,给你拆解清楚:aws s3 sync 不会等待文件关闭或传输完成,它会尝试复制当前处于打开状态的文件——但复制的是该文件在Sync运行时刻的不完整版本。
针对你的SFTP同步场景的具体说明
你用Cron每10分钟执行aws s3 sync . s3://test/,遇到大文件正在上传的情况时:
- 当文件还在往SFTP服务器传输(文件描述符未关闭、内容还在写入),此时文件的大小和修改时间会持续变化。
aws s3 sync运行时会读取这些实时的文件属性,认为这是一个需要同步的“新文件”或“已更新文件”,于是把当时的不完整内容上传到S3。 - 等文件上传完成、描述符关闭后,文件的大小和修改时间会稳定下来。下一次Cron触发Sync时,它会对比S3上的不完整文件和本地的完整文件,发现两者的大小/修改时间不匹配,就会重新上传完整版本,覆盖之前的不完整副本。
避免同步不完整文件的实用技巧
如果你想彻底杜绝把未完成的文件传到S3,可以试试这两个方案:
- 临时目录中转:配置SFTP先把文件传到一个临时目录,等上传100%完成后,再通过原子性操作(同文件系统下的移动几乎瞬间完成)把文件移到Sync监控的目录,这样
aws s3 sync只会看到完整的文件。 - 前置状态检查:在运行
aws s3 sync之前,用lsof命令检测当前目录下哪些文件正处于打开写入状态,排除这些文件后再执行同步。比如可以写个简单的shell脚本,先筛选出未被活跃写入的文件列表,再指定这些文件进行Sync。
内容的提问来源于stack exchange,提问作者Putharekulu
相关产品推荐
相关产品推荐

