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 rsync
,rsync
将不再找到中间文件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 选项或将规则标记为仅在发送端匹配(请参阅过滤规则部分中的包含/排除修饰符)。