如何判断文件是否正在从Linux向Windows CIFS共享写入



我正在尝试编写一个脚本,以将视频文件(从几MB到几GB)写入Windows服务器上的共享文件夹。

理想情况下,该脚本将在Linux机器上运行,以大约每15-120秒的间隔监视Windows共享文件夹,并将所有已完全完成写入共享文件夹的文件上传到FTP站点。

我还不能确定任何标准,使我能够确切地知道一个文件是否已完全写入共享。Windows似乎为整个文件大小在共享中保留了一个位置(因此文件大小不会增量增长),并且修改日期似乎是文件开始写入的时间,但它不会随着文件继续增长而增加。LSOF和fuser似乎没有意识到这个文件,甚至Samba工具似乎也没有指示它被锁定,但我不确定这是否因为我没有使用正确的选项进行挂载。我试过尝试打开文件或重命名它,我能想到的最好的是一个"文本文件繁忙"错误代码,但这似乎会导致文件复制的严重延迟。天真地上传文件而不检查它是否已经完成复制不仅不会抛出任何类型的错误,而且实际上似乎是从分配的空间中上传空字节或随机字节到FTP,导致文件完全损坏(如果网络写入进程比FTP慢)。

我对写作过程没有任何控制权。它将在几十台机器上进行,并且几乎完全由网络共享的Windows操作系统文件副本组成。

我可以控制Windows服务器上的共享选项,并且我可以完全控制Linux机器。是否有一些方法可以检查Windows CIFS共享上的锁,使我能够在尝试通过FTP上传文件之前确保文件已完全完成写入?或者唯一可能的解决方案是让Linux服务器在本地拥有共享?

编辑

tldr,我真的在寻找类似于'lsof'的东西,适用于cifs挂载的共享。我不在乎它有多低级,但如果它是我可以从Python调用的东西,那将是理想的。在文件到达之前,我无法移动共享或重命名文件

我以前有过这个问题,我不确定我的方式是最好的方式,它是最明确的一个黑客修复,但我使用了睡眠间隔和文件大小检查,(我希望文件已经增长,如果它被写入…)

在我的情况下,我想知道不仅文件没有被写入,而且windows共享没有被写入…

my code is;

while [ "$(ls -la "$REMOTE_CSV_DIR"; sleep 15)" != "$(ls -la "$REMOTE_CSV_DIR")" ]; do
    echo "File writing seems to be ocuring, waiting for files to finish copying..."
done

(ls -la包括以位为单位的文件大小…)

这个怎么样?:

将windows共享更改为指向为此保留的实际Linux目录。然后,使用简单的Linux脚本,您可以很容易地确定是否有任何文件有任何编写者。一旦有文件没有写入,将其复制到需要的windows文件夹

最新更新