Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux lftp镜像文件传输期间可能的争用条件?_Linux_Shell_Sftp_Lftp - Fatal编程技术网

Linux lftp镜像文件传输期间可能的争用条件?

Linux lftp镜像文件传输期间可能的争用条件?,linux,shell,sftp,lftp,Linux,Shell,Sftp,Lftp,我试图使用lftp mirror配置使本地文件夹[lftp\u source\u folder]和远程文件夹[lftp\u server\u path]保持同步 下面给出了连续运行它的脚本 while true do lftp -f $BATCHFILE sleep 20 done $BATCHFILE主要包括以下内容: # sftp config + echo "mirror --Remove-source-files -R /lftp_source_folder /lft

我试图使用lftp mirror配置使本地文件夹[lftp\u source\u folder]和远程文件夹[lftp\u server\u 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\u source\u文件夹

现在,我感到困惑的是,由于这种实现,是否有可能出现竞争条件

比如说

  • 我的脚本正在将文件移动到/lftp\u source\u文件夹 假设50%的文件已移动到/lftp_source_文件夹,并且mv命令被操作系统中断。
    /lftp_source_folder/new_file.txt
    [
    new_file.txt
    仅为大小的50%]
  • lftp已被while循环调用
  • mv命令再次继续
  • 在步骤2中,lftp是否将完成50%的文件上载到lftp服务器并删除该文件?在这种情况下,数据将丢失


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

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

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

    解决方法是首先将文件移动到与
    /lftp\u source\u folder
    相同文件系统上的临时文件夹中,然后将其从那里移动到
    /lftp\u source\u folder
    。因此,当镜像脚本在那里看到它时,它保证是完整的