lftp镜像文件传输期间可能出现的竞争条件?

lftp mirror possible race condition during file transfer?

我试图使用 lftp 镜像 配置使本地文件夹 [lftp_source_folder] 和远程文件夹 [lftp_server_path] 保持同步。

运行 的脚本如下所示。

while true
do
    lftp -f $BATCHFILE
    sleep 20
done

$BATCHFILE 主要包含以下内容:

# sftp config + 
echo "mirror --Remove-source-files -R /lftp_source_folder /lftp_server_path/" >> $BATCHFILE

但问题是,我有一个脚本会继续将文件移动到 /lftp_source_folder.

现在我很困惑是否有可能由于此实现而出现 竞争条件

例如

  1. 我的脚本正在将文件移动到 /lftp_source_folder 假设 50% 的文件已移动到 /lftp_source_folder 并且 mv 命令被 OS 中断。 /lftp_source_folder/new_file.txt [new_file.txt 只是大小的 50%]
  2. while 循环调用了 lftp。
  3. mv 命令再次继续

在第2步中,lftp会把完成50%的文件上传到lftp服务器然后删除文件吗?在这种情况下数据将会丢失。

如果是竞争条件,解决方案是什么?

如果您在同一个文件系统中移动文件,则不存在竞争条件。 mv 只是执行一个 rename() 操作,这是原子操作,它不是复制文件数据。

但是如果您在不同的文件系统之间移动,您确实会遇到竞争条件。这是作为副本完成的,然后删除原始文件,并且您的脚本可能会在仅复制部分文件时将文件上传到 FTP 服务器。

解决方法是先将文件移动到与 /lftp_source_folder 相同的文件系统上的临时文件夹,然后将其从那里移动到 /lftp_source_folder。所以当镜像脚本在那里看到它时,它保证是完整的。