如果 cron 在写入文件时运行,rsync 会进行 2 个备份

如果 cron 在写入文件时运行,rsync 会进行 2 个备份

rsync我有一个 crontab每 30m运行一次这个命令

rsync -rtbpgoi --suffix="."$(date +"%Y%m%d%H%M") --exclude=".*" \
--exclude="~*" --exclude="[Tt][Hh][Uu][Mm][Bb][Ss].[Dd][Bb]" \
--exclude="[Dd][Ee][Ss][Kk][Tt][Oo][Pp].[Ii][Nn][Ii]" \
--info=STATS0,FLIST0,NAME1 /mnt/datastore/ /mnt/dsbackup

发生的情况是,如果文件正在写入过程中,例如长时间下载,我最终会得到该文件的额外备份副本,其中一个是不完整下载的备份。

是否有某种方法可以rsync忽略仍在写入的文件或其他方法来避免备份不完整的文件?我知道我可以删除-b--suffix开关,但我确实想保留在文件更改时保留版本历史记录的功能。

答案1

回答你的问题:rsync据我所知,确实不是有任何内置方法可以知道您正在运行的某个单独的程序(网络浏览器等)正在主动修改文件。

给定您的备份类型(每 30 分钟运行一次相同的源和目标),您可以实现最终的通过向命令添加该选项,删除与最终文件具有不同名称的任何中间文件(例如,download_1.zip.tmp可能是 的中间文件download_1.zip) 。--delete

在第一次运行期间rsync,该download_1.zip.tmp文件将被复制到您的备份位置。假设下载在 30 分钟内完成,中间文件download_1.zip.tmp将被重命名为download_1.zip.经下一个run of rsyncrsync将不再找到中间文件download_1.zip.tmp(因为它已重命名为download_1.zip),并且它将在备份中删除download_1.zip.tmp并替换它。download_1.zip这个会/mnt/dsbackup从备份 ( ) 中删除源 ( ) 中不再存在的任何其他文件/mnt/datastore

来自rsync的手册页(版本 3.1.0):

这告诉 rsync 从接收端删除无关文件(不在发送端的文件),但仅限于正在同步的目录。您必须要求 rsync 发送整个目录(例如“dir”或“dir/”),而不使用目录内容的通配符(例如“dir/*”),因为通配符由 shell 扩展,因此 rsync 会得到一个请求传输单个文件,而不是文件的父目录。从传输中排除的文件也不会被删除,除非您使用 --delete-excluded 选项或将规则标记为仅在发送端匹配(请参阅过滤规则部分中的包含/排除修饰符)。

相关内容