我们用来rsync
同步同一台计算机上的两个文件夹。
文件将从另一个应用程序写入源文件夹。我们遇到的问题是,即使文件没有完全写入/复制到源文件夹,rsync 也会将该文件复制到目标。
有什么方法/选项可以检查/转移仅有的源文件夹中的完整文件
答案1
排除部分文件是不可能的,因为不存在这样的概念。一旦生产者创建了文件,该文件就存在,但它一开始是空的,然后逐渐被填满。
您可以测试文件是否打开以进行写入;那会告诉你它不完整。然而,这是不可靠的:如果生产者崩溃(进程崩溃或整个系统崩溃),您将得到一个看起来完整的不完整文件。
您应该做的是为生产者定义一个协议来将文件标记为完整。执行此操作的正常方法(而且几乎是唯一明智的方法)是生产者在临时位置创建文件,然后在完成后将其移动到位(使用rename
系统调用或shell 命令)。mv
您可以使用命名约定:
生产者:写入
$FILENAME.tmp
,然后移动到最终文件。generate_data >"dir/$FILENAME.tmp" mv "dir/$FILENAME.tmp" "dir/$FILENAME"
消费者:排除
.tmp
文件。rsync -a --exclude='*.tmp' dir remote:
或者您可以使用暂存目录。
生产者:写入暂存目录,然后移动到最终位置。
generate_data >"dir/staging/$FILENAME" mv "dir/staging/$FILENAME" "dir/"
消费者:排除暂存目录。
rsync -a --exclude='/staging' dir remote:
答案2
如果文件的大小是固定的(在应用程序的写入操作之后),您可以仅根据大小传输文件,这样尚未完成写入的文件将不会被复制:
--max-size=SIZE don't transfer any file larger than SIZE
--min-size=SIZE don't transfer any file smaller than SIZE
的选项rsync
提供了这一点。
或者,您可以使用fuser
或lsof
检查应用程序是否在开始传输时写入文件:
if fuser /path/to/file.txt >/dev/null 2>&1; do
rsync ....
else
sleep 10
fi
答案3
我使用以下命令查找过去 30 分钟内未修改的所有文件。
ssh sourceServer "find sourceDir -mmin +30 -type f | xargs -i -r rsync [ --remove-sent-files ] -aP {} destServer:destPath/"