Есть ли эквивалент `tail -f` в Perl? - PullRequest
0 голосов
/ 10 сентября 2010

Я пишу скрипт, который прослушивает изменения в файле журнала и действует соответствующим образом.На данный момент я использую open my $fh, "tail -f $logfile |";, но в идеале я не хочу использовать системные вызовы.

Я пробовал File :: Tail , но у него минимальный интервал в 1 секунду (я пробовал проходить меньше, но по умолчанию он равен 1 секунде, даже если я передаю 0).Я проверил источник для этого, и он, кажется, использует sleep (), которая принимает целое число.Прежде чем я попытаюсь написать свой, есть ли другие варианты?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 10 сентября 2010
  1. Знаете ли вы, что tail -f также по умолчанию использует 1-секундный сон? Это так! (По крайней мере для хвоста GNU ...)
  2. File::Tail фактически использует Time :: HiRes sleep, что означает, что параметр времени ожидания не является целым числом; Вы можете установить любое количество секунд, с которым ваша система может справиться.
3 голосов
/ 10 сентября 2010

В документации много хорошего, включая ответ на этот точный вопрос.От ответа perlfaq5 до Как мне сделать "tail -f" в perl?


Первая попытка

seek(GWFILE, 0, 1);

Оператор search (GWFILE, 0, 1) не меняет текущую позицию, но очищает условие конца файла в дескрипторе, так что следующий заставляет Perl снова попытаться что-то прочитать.

Если это не сработает (это зависит от особенностей вашей реализации stdio), то вам нужно что-то более похожее на это:

for (;;) {
  for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
    # search for some stuff and put it into files
  }
  # sleep for a while
  seek(GWFILE, $curpos, 0);  # seek to where we had been
}

Если это по-прежнему не работает, изучите метод clearerr изIO :: Handle, который сбрасывает состояние ошибки и конца файла в дескрипторе.

Также имеется модуль File :: Tail из CPAN.

2 голосов
/ 10 сентября 2010

CPAN имеет File::ChangeNotify

0 голосов
/ 10 сентября 2010

По моему мнению, нет ничего плохого в использовании tail -f трубы, как вы уже делаете. Во многих ситуациях стремление к чистоте языка, например, «никаких системных вызовов», контрпродуктивно.

Кроме того, я видел проблемы с File::Tail в длительных процессах. К сожалению, я не могу подтвердить это утверждение какими-либо вескими доказательствами, поскольку это произошло довольно давно, я не устранял проблемы, заменив использование File::Tail вместо tail -F pipe.

...