2016-10-16 17 views
0

EHLO!Файл файла Perl за 30 секунд

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

Поэтому я использую Per function «File :: Tail», и я не знаю, как запустить его всего за 30 секунд, хвост остается там до тех пор, пока я не выйду вручную ( Он работает так же, как команда хвоста). Я искал решения, используя fork, но до сих пор не повезло или не испытал на себе этого. Часть «хвоста» кода, как это:

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

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

+3

['alarm'] (http://perldoc.perl.org/functions/alarm.html)? – mob

+2

'sleep (30);' перед вызовом '$ file-> read';; – ikegami

+3

F :: T не поддерживает это, поэтому ваши параметры: 1) Найдите модуль, который делает то же самое, что и F: : T, но поддерживает таймаут 2) Monkeypatch F :: T 3) Reimplement F :: T с возможностью тайм-аута, 4) 'alarm' 5) Использовать механизм, который не включает'/var/log/messages ' – ikegami

ответ

1

Вы можете достичь этого, используя File::Tail::select().

Приведенный ниже пример помещает стоп-файл в один сток в массив @pending, который затем обрабатывается. Looping 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; 
     } 
    } 
}