我试图使用 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 命令被操作系统中断。
/lftp_source_folder/new_file.txt
[new_file.txt
只有 50% 的大小] - lftp 已被 while 循环调用。
- mv 命令再次继续
在第2步中,lftp是否会将完成50%的文件上传到lftp服务器并删除该文件?在这种情况下数据将会丢失。
如果是竞争条件,解决方案是什么?
最佳答案
如果您在同一个文件系统中移动文件,则不存在竞争条件。 mv
只是执行一个 rename()
操作,这是原子操作,它不会复制文件数据。
但是如果您在不同的文件系统之间移动,您确实会遇到竞争条件。这是作为一个副本,然后删除原始文件来完成的,当只复制文件的一部分时,您的脚本可能会将文件上传到 FTP 服务器。
对此的解决方案是先将文件移动到与 /lftp_source_folder
相同的文件系统上的临时文件夹,然后将其从那里移动到 /lftp_source_folder
。所以当镜像脚本在那里看到它时,它保证是完整的。
关于linux - lftp镜像文件传输期间可能出现的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485942/