Файл хвоста 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;
}
}
}