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

时间:2013-01-14 06:12:22

标签: python linux share cifs

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

理想情况下,脚本将在Linux机器上运行,每隔15-120秒间隔一段时间查看Windows共享文件夹,并将完全写入共享文件夹的所有文件上传到FTP站点。

我无法确定任何允许我确定文件是否已完全写入共享的标准。似乎Windows在整个文件大小的共享上保留了一个位置(因此文件大小不会逐渐增长),并且修改日期似乎是文件开始写入的时间,但它不会作为文件递增继续增长。 LSOF和热熔器似乎并不知道该文件,甚至Samba工具似乎也没有表明它被锁定,但我不确定是不是因为我没有安装正确的选项。我尝试过尝试打开文件或重命名这些内容,而我能够提出的最好的是“文本文件忙”错误代码,但这似乎会导致文件复制出现重大延迟。天真地上传文件而不检查它是否已完成复制不仅不会抛出任何类型的错误,但实际上似乎从分配的空间上传nul或随机字节到FTP导致完全损坏的文件(如果网络写入进程比FTP慢。

我无法控制写作过程。它将在几十台计算机上进行,几乎完全由Windows操作系统文件副本组成,分别用于网络共享。

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

修改

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

2 个答案:

答案 0 :(得分:1)

之前我遇到过这个问题,我不确定我的方式是最好的方式,而且它是最deffinatley的一个hacky修复,但我使用了睡眠间隔和文件大小检查,(我希望文件增长,如果它正在写给...)

在我的情况下,我想知道不仅没有写入文件,而且还没有写入Windows共享...

我的代码是;

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包括以位为单位的文件大小......)

答案 1 :(得分:1)

这个怎么样?:

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