0

哎呀!

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

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

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

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

4

1 回答 1

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;
        }
    }
}
于 2016-10-22T14:20:13.730 回答