我试图使用 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/new_file.txt
[new_file.txt
的大小仅为50%] 在步骤2中, lftp 是否会将完成50%的文件上传到lftp服务器并删除该文件?在这种情况下数据将丢失。
如果是竞赛条件,那么解决方案是什么?
答案 0 :(得分:1)
如果要在同一文件系统中移动文件,则没有竞争条件。 mv
只需执行rename()
操作,这是原子操作,不复制文件数据。
但是,如果您在不同的文件系统之间移动,则确实可以得到竞争条件。这是作为副本执行的,然后删除原始文件,并且您的脚本可能会在仅复制文件的一部分时将文件上传到FTP服务器。
解决方案是先将文件移动到与/lftp_source_folder
相同的文件系统上的临时文件夹,然后再将文件从那里移动到/lftp_source_folder
。因此,当镜像脚本在此处看到时,就可以保证它是完整的。