【问题标题】:lftp mirror possible race condition during file transfer?lftp 在文件传输期间镜像可能的竞争条件?
【发布时间】:2018-07-23 19:27:05
【问题描述】:

我试图使用 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服务器并删除该文件吗?在这种情况下,数据将丢失。

如果是竞态条件,解决办法是什么?

【问题讨论】:

    标签: linux shell sftp lftp


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多