Файл хвоста Perl в течение 30 секунд

EHLO!

Это началось как "эй, дай мне 30 минут", но вот я на следующий день. В основном я хочу проверять "/var/log/messages" в течение 30 секунд, а когда кто-то подключает жесткий диск USB в течение этого времени, выполняет некоторые команды.

Поэтому я использую функцию Per "File::Tail", и вроде как работает, но я не знаю, как запустить ее всего 30 секунд, tail остается там до тех пор, пока я не выйду вручную (она работает как команда tail). Я искал решения с использованием форка, но мне все равно не повезло и не было опыта. Часть "хвостового" кода выглядит так:

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

Я ценю любую помощь или совет. Если у кого-то есть другое решение, использующее другое, функцию или что-то еще, это нормально, мне нужен код для "CGI".

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;
        }
    }
}
Другие вопросы по тегам