LINUX.ORG.RU

pipe (mkfifo) - накопление данных


0

0

Вопрос знатокам: Как в начале скрипта отловить обьем накопленных в трубе (Pipe) данных? И по возможности время их накопления.

Есть такая ситуевина:
Есть биллинг (stargazer) который раздает юзерам интернет, юзеров много и они работают за разными компьютерами в пределах локальной сети (юзеров больше чем компов).
Есть squid в прозрачном режиме, который экономит траффик, и http->i-cap->clamav. Сквид пишет свои логи в access.log,

Хочется знать по каким сайтам лазил пользователь.

В момент авторизации пользователя в БД в таблице "now" создается соответствие юзер=ip, плюс для истории в conn-log - когда юзер подключался и отключался.

mkfifo /var/log/squid/access.log - создана труба, на другом конце трубы сидит перловый скрипт (./s2m.pl < /var/log/squid/access.log &), который обрабатывает поток данных и пишет в БД ссылки посещенные пользователем и их username.

В то время когда вывод из трубы не направлен на скрипт (перезапуск скрипта, его зависание и т.д.) данные накапливаются в трубе. Админ руками перезапускает скрипт, однако неизвестно за какое время там накоплены данные. Если за 5 секунд, то все нормально, а если несколько часов - то табличка "now" не актуальна.

Вопрос знатокам: Как в начале скрипта отловить обьем накопленных в трубе данных? И по возможности время их накопления.

Или может кто видел патчик для squid чтобы он сам писал свои логи в БД...

anonymous

Насколько я помню, писать в fifo, у которого нет читателя, нельзя (приходит SIGPIPE и write() дает ошибку EPIPE). Потому, ИМХО, ваш вопрос некорректен, если скрипт прочитал из сокета все данные и потом аварийно завершился, то данных в сокете не будет.

А так, в логе squid'а каждая строка начинается полем время. Поэтому, правильно написанный скрипт может держать у себя время подключения и отключения пользователя и сопоставлять каждую прочитанную строку с этими временами. Или можно сравнивать это время с текущим и если разница больше минуты (часа), то запись не актуальна...

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

> Насколько я помню, писать в fifo, у которого нет читателя, нельзя

фифо должен быть открыт на чтение и запись для нормальной работы(на стороне читателя и писателя соответсвенно).

если же его открыть в неблокирующем режиме, то достаточно только читателя.

asgard
()

> Как в начале скрипта отловить обьем накопленных в трубе данных?
man 2 tee

int null_fd = open("/dev/null", O_WRONLY);
int size = tee(pipe_fd, null_fd, ~0, 0);

rei3er
()
Ответ на: комментарий от dilmah

> у топикстартера читатель умирает

угу, забыл уточнить, ридер должен опенить первым.

asgard
()
Ответ на: комментарий от dilmah

канал может быть открыт как R/W на стороне писателя
или посредством open() канал открыт повторно на чтение (для избежания SIGPIPE)

rei3er
()
Ответ на: комментарий от asgard

Интерестно, а сам squid сейчас нормально обрабатывает ситуацию, что у него лог-файл это fifo? Раньше вроде ему это не нравилось, в том плане что он открывал этот файл с флагами O_WRONLY|O_NOBLOCK и не был готов, к отсутсвию читателя == ошибки записи...

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

Вы правы, без ридера писать в трубу нельзя. Как у меня это вчера получалось - х.з., наверное синдром конца рабочего дня. Мысль насчет сравнивать время мне вчера пришла в голову в процессе чистки зубов перед сном, но к счастью под рукой не было компа (жена бы убила).

А есть-ли аналог fifo с накоплением данных? Может даже с промежуточным хранением на винте.

2 asgard: > имхо posix queues тут подойдут МОжно ссылочку? Гугл топит в ссылках...

Топикстартер

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