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.
现在我很困惑是否有可能由于此实现而出现 竞争条件。
例如
- 我的脚本正在将文件移动到 /lftp_source_folder
假设 50% 的文件已移动到 /lftp_source_folder 并且 mv 命令被 OS 中断。
/lftp_source_folder/new_file.txt
[new_file.txt
只是大小的 50%]
- while 循环调用了 lftp。
- mv 命令再次继续
在第2步中,lftp会把完成50%的文件上传到lftp服务器然后删除文件吗?在这种情况下数据将会丢失。
如果是竞争条件,解决方案是什么?
如果您在同一个文件系统中移动文件,则不存在竞争条件。 mv
只是执行一个 rename()
操作,这是原子操作,它不是复制文件数据。
但是如果您在不同的文件系统之间移动,您确实会遇到竞争条件。这是作为副本完成的,然后删除原始文件,并且您的脚本可能会在仅复制部分文件时将文件上传到 FTP 服务器。
解决方法是先将文件移动到与 /lftp_source_folder
相同的文件系统上的临时文件夹,然后将其从那里移动到 /lftp_source_folder
。所以当镜像脚本在那里看到它时,它保证是完整的。
我试图使用 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.
现在我很困惑是否有可能由于此实现而出现 竞争条件。
例如
- 我的脚本正在将文件移动到 /lftp_source_folder
假设 50% 的文件已移动到 /lftp_source_folder 并且 mv 命令被 OS 中断。
/lftp_source_folder/new_file.txt
[new_file.txt
只是大小的 50%] - while 循环调用了 lftp。
- mv 命令再次继续
在第2步中,lftp会把完成50%的文件上传到lftp服务器然后删除文件吗?在这种情况下数据将会丢失。
如果是竞争条件,解决方案是什么?
如果您在同一个文件系统中移动文件,则不存在竞争条件。 mv
只是执行一个 rename()
操作,这是原子操作,它不是复制文件数据。
但是如果您在不同的文件系统之间移动,您确实会遇到竞争条件。这是作为副本完成的,然后删除原始文件,并且您的脚本可能会在仅复制部分文件时将文件上传到 FTP 服务器。
解决方法是先将文件移动到与 /lftp_source_folder
相同的文件系统上的临时文件夹,然后将其从那里移动到 /lftp_source_folder
。所以当镜像脚本在那里看到它时,它保证是完整的。