您将使用的命令可能有效,但会有一些我想避免的性能问题。
- “fswatch”会在每次修改 FS 时生成输出(例如每次文件更新。
- “rsync”每次都会递归检查目录及其子目录和文件中所有可能的更改。(不计算实际的数据拷贝,只有源端和目的端有大量文件和目录时,这个操作需要很长时间)
这意味着对于“fswatch”输出的每一行,都会启动一个“rsync”实例,而“rsync”的持续时间会越来越长。
48 小时是很多时间,并且复制文件(~100GB)无论如何都不会花费这么长时间(磁盘到磁盘非常快,通过千兆网络也非常快)。
相反,我会建议rsync -a --delete /source /destination
在生成过程中定期(例如 30 分钟)执行一次,并在最后执行一次,以确保没有遗漏任何内容。一个简短的脚本可能包含:
#!/bin/bash
while ps -ef | grep -q "process that generates files"; do
echo "Running rsync..."
rsync -a --delete /source /destination
echo "...waiting 30 minutes"
sleep 1800 # seconds
done
echo "Running final rsync..."
rsync -a --delete /source /destination
echo "...done."
...只需将“生成文件的进程”替换为生成文件的进程在运行时在“ps -ef”输出中看起来像的任何名称。根据需要调整时间,我认为在 30 分钟内会创建约 2GB 的数据,这些数据可以在几分钟内复制。
该脚本将确保“rsync”不会运行更多次,它将专注于复制文件而不是经常比较源和目标。
选项“-a”(存档)将暗示您使用的选项和更多(-rlptgoD),“--delete”将删除“/destination”上存在但“/source”上不存在的任何文件(在临时文件被复制但最终结构中实际上不需要的情况下很方便)。