linux - lftp镜像文件传输期间可能出现的竞争条件?

标签 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服务器并删除该文件?在这种情况下数据将会丢失。

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

最佳答案

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

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

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

关于linux - lftp镜像文件传输期间可能出现的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485942/

相关文章:

notepad++ 或 sed 中的正则表达式返回两个不同的字符串

linux - 在邮件中嵌入图像并使用 Linux 邮件将其发送到 Outlook 2007

regex - 使用 "grep -n"和 echo : : double backslash interpreted

linux - grep/根据第一个文件中的列表从第二个文件中获取字符串

linux - perl linux命令不起作用

linux - ubuntu 12.04的启动和停止脚本

linux - Shell 脚本 - 两个 for 循环和更改文件扩展名

linux - 用于创建 Azure Linux VM 并在其中设置 FTP 连接的 Powershell 脚本

java - 如何使用spring从sftp服务器获取zip文件

linux - 如何从Linux机器将公钥放入sftp服务器?