【问题标题】:How can I asynchronously monitor a file in Perl?如何在 Perl 中异步监视文件?
【发布时间】:2011-02-08 14:50:54
【问题描述】:

我想知道这是否可能,如果可能,如何创建一个持续监视文件/db 的 perl 脚本,然后在文件更改时调用子例程来执行文本处理。我很确定使用套接字可以做到这一点,但这需要用于在共享主机上运行的站点上的网络聊天应用程序,而且我不太确定它是否允许使用套接字。

基本思路是:

  • 为聊天文件/数据库创建监听器
  • 当使用新消息更新文件时,调用子例程
  • 被调用的子程序会将新消息发送回浏览器进行显示

提前致谢。

【问题讨论】:

  • 听起来没那么难,只需每隔几秒用-M 轮询文件即可。
  • 唯一的问题是,每隔几秒轮询一次文件可能会使服务器/带宽过载。但是,如果有一种方法可以只监视它的时间戳,那我应该认为不会占用太多资源。

标签: perl file chat listener


【解决方案1】:

许多操作系统都运行一项服务,该服务允许应用程序注册请求,以便在文件或路径更新时得到通知。这通常称为File Alteration Monitor。有关某些可用系统,请参阅链接的 wikipedia 页面。最近的 linux 系统使用 Inotify,以前使用 Dnotify 或 gamin。 OS X 使用 FSEvents。 Windows 也有类似的系统。我不知道有任何模块或机制可以跨平台运行所有这些系统,但 CPAN 上有可用的特定模块,例如 SGI::FAMFile::Tail::FAM

【讨论】:

  • 嗯,File::Tail::FAM 似乎是我要找的东西,我会调查一下。谢谢。
  • File::ChangeNotify 希望成为其中一个通用的跨平台,但目前它只有 Inotify、BSD KQueues 的后端和一种回退轮询方法(stat all of文件和目录定期)。没有Win32,没有FAM。 :(
【解决方案2】:

我会使用一个 cron 作业和一个调用 Perl 脚本的 Makefile 来做到这一点。方便的是,您可以自动获取 Perl 脚本的 atime 作为要比较的时间戳,因为脚本的 atime 在调用时会更新。

【讨论】:

  • 这看起来很有前途,但可惜的是,该站点位于共享主机上。
【解决方案3】:
use POE qw(Wheel::FollowTail);
POE::Session->create(
    inline_states => {
      _start => sub {
        $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
          Filename => "/var/log/thttpd.log",
          InputEvent => "got_log_line",
          ResetEvent => "got_log_rollover",
        );
      },
      got_log_line => sub {
        #print "Log: $_[ARG0]\n";
        parseline($_[ARG0]);
      },
      got_log_rollover => sub {
        #print "Log rolled over.\n";
      },
    }
  );

POE::Kernel->run();
exit;

#parseline()...etc.

【讨论】:

  • 只是想知道,该模块是包含在标准 perl 安装中,还是来自 CPAN?
猜你喜欢
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多