LINUX.ORG.RU

perl и pipe


0

0

Привет всезнающий ALL.

Пишу (переделываю в очередной раз) небольшой скрипт (s2m), дабы он закидывал логи сквида в БД. Есть труба (mkfifo /etc/squid3/access), она указана в конфиге сквида в качестве лог файла. Запускаем обработчик (s2m), запускаем сквид, все ок. Каркас примерно такой:

open(FIFO,"/etc/squid3/access");

while($original=<FIFO>) { #обработка

}

И длится эта идилия пока не случится в системе squid3 -k reconfigure или squid3 -k rotate (ротейт не нужен :-), но иногда приходится делать реконфиг). Я не понимаю что сквид с трубой делает, но скрипт-читатель отваливается (EOF в трубе?). А сквид не может писать в трубу без читателя и отваливается. Приходится после каждого чиха перезапускать s2m. Если тупо указать:

while(1) { $original=<FIFO>;

if ($original != '') { #обработка

}} То скрипт не отваливается - продолжает работать. Но не аккуратненько както...

Собсна вопрос - как можно "взять" трубу "покрепче" - чтобы скрипт его не терял?

anonymous

использовать аналог tail -f.
для perl точно есть модули.

anonymous2 ★★★★★
()
Ответ на: комментарий от nikolayd

не, сигпайп здесь не при чем, он как раз шлется сквиду, тут надо ловить 0 из read. вопрос в другом: ОПу нужно перловую абстракцию над пайпом которая переоткрывала бы пайп в случае его закрытия писателем

BreadFan ★★
()

Какие проблемы? То, что ты написал и есть "крепкий" pipe. Лучше так:

open(FIFO, "< /etc/squid3/access") || die("Err opening a fifo: $!");

while (1) {
  $line = <FIFO>;
  if ( ! defined($line) ) {
        # Do a sleep for a smaller overhead of the system
        sleep(1);
        next;
  }
  ...
}

close(FIFO);

Lego_12239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.