【问题标题】:Perl tail file for 30 secondsPerl 尾文件 30 秒
【发布时间】:2016-10-16 01:54:11
【问题描述】:

EHLO!

这开始就像“嘿,给我 30 分钟”,但我在一天之后。 基本上我要做的是检查“/var/log/messages”30秒,当有人在此期间插入USB硬盘时,执行一些命令。

所以我使用 Per 函数“File::Tail”,有点工作,但我不知道如何运行它 30 秒,tail 一直停留在那里,直到我手动退出( 它就像 tail 命令一样工作)。我一直在寻找使用 fork 的解决方案,但仍然没有运气或经验。部分“尾”代码是这样的:

while ((defined($line=$file->read)) ) {

感谢任何帮助或提示。如果有人使用另一个函数或其他任何方法有另一个解决方案,那很好,我需要“CGI”的代码。

【问题讨论】:

  • sleep(30); 在您致电 $file->read 之前 ;)
  • F::T 不支持,因此您的选择是:1) 搜索与 F::T 执行相同操作但支持超时的模块 2) Monkeypatch F:: T 3) 重新实现具有超时功能的 F::T,4) alarm 5) 使用不涉及 /var/log/messages 的机制
  • 这段代码似乎不太可能在 CGI 程序中运行良好。 CGI 程序 a)(通常)在远程服务器上运行,并且 b) 在等待安装 USB 记忆棒时可能会超时。你能解释更多关于你在这里实际想要实现的目标吗?我认为你走错了路。
  • 用户应该按下一个按钮开始,我将执行一个至少 30 秒的 AGI,我会告诉他连接设备并检测它

标签: perl usb detect tail plug-and-play


【解决方案1】:

您可以使用File::Tail::select() 实现此目的。

下面的示例将一秒的尾文件放入@pending 数组,然后进行处理。循环 30 次将使您非常接近 30 秒(取决于您的 /var/log/messages 的活跃程度)。如果您需要更精确的计时,您可以存储循环前的时间并比较每次迭代经过了多长时间。

use File::Tail;
$file = File::Tail->new(name=>"/var/log/messages", interval=>1);

TIMER_LOOP:
while($t++ < 30){
    (undef,undef,@pending)=File::Tail::select(undef,undef,undef, 1, $file);
    for(@pending){
        if($_->read =~ /New USB device found/){
            print "Hello USB!\n";
            last TIMER_LOOP;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多