【问题标题】:How can I test whether a csv file is currently open and being written to - the file, not a file handle - with Perl?如何使用 Perl 测试 csv 文件当前是否打开并写入 - 文件,而不是文件句柄?
【发布时间】:2010-05-25 15:39:35
【问题描述】:

我有一个 Clipper 系统将 csv 文件写入 Windows 目录。我有一个在 Linux 服务器上运行的 Perl 脚本,它正在读取该 Windows 目录的挂载并将文件导入数据库。

现在我们正在使用标志文件来指示何时不再写入 csv;标志文件在 csv 完成后被写入。我真的宁愿从 csv 本身获取我需要的东西,但我似乎无法找到一种方法来判断文件何时打开并被写入。

lsof 似乎无法满足我的需求。我尝试使用flock 并使用排他锁打开文件,认为如果文件被修改可能会引发错误,但事实并非如此。

有什么想法吗?

【问题讨论】:

  • 您会发现所有解决方案都是针对操作系统的。使用单独的文件的存在与您将找到的一样干净的解决方案。
  • 这就是我的决定。

标签: perl


【解决方案1】:

根据linux的flock手册页:

flock() 不会通过 NFS 锁定文件。 改用 fcntl(2) :确实有效 在 NFS 上,给定一个足够近的 Linux 版本和服务器 支持锁定。

您是否尝试过使用 fcntl()?谷歌搜索我发现有几个examples 的人使用 fcntl 和 CIFS。

【讨论】:

    【解决方案2】:

    由于您正在安装到 Windows,它可能无法正常工作,但也许 inotify 会有所帮助。

    【讨论】:

      【解决方案3】:

      如果 inotify 不起作用,请使用Poor Man's Polling:如果修改时间超过两秒,则文件已完成写入。

      【讨论】:

      • 这需要太多时间。我们一天可能会处理 10,000 多个文件。每 2 秒增加了很多处理时间。我测试了 690 个文件,导入它们大约需要 25 分钟。使用标志文件,只用了大约 50 秒。
      【解决方案4】:

      Linux::Inotify2File::Monitor 之类的东西可以用来监控文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        相关资源
        最近更新 更多