如何在Perl中异步监视文件?

时间:2010-04-15 22:39:06

标签: perl file chat listener

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

基本理念是:

  • 为聊天文件/数据库创建一个侦听器
  • 使用新消息更新文件时,请调用子例程
  • 被调用的子程序将新消息发送回要显示的浏览器

提前致谢。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

我使用cron作业和调用Perl脚本的Makefile执行此操作。方便的是你自动获取Perl脚本的atime作为比较的时间戳,因为脚本的atime在被调用时会更新。

答案 2 :(得分:1)

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.