lftp镜像文件传输期间是否可能出现竞争状况?

时间:2018-07-23 19:27:06

标签: linux shell sftp lftp

我试图使用 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命令被操作系统中断。    /lftp_source_folder/new_file.txt [new_file.txt的大小仅为50%]
  2. lftp已由while循环调用。
  3. mv命令再次继续

在步骤2中, lftp 是否会将完成50%的文件上传到lftp服务器并删除该文件?在这种情况下数据将丢失。

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

1 个答案:

答案 0 :(得分:1)

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

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

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