Xpoint
   [напомнить пароль]

Блокировка файла в родственных процессах

Метки: [без меток]
2013-05-24 14:55:16 [обр] Константин Долгань[досье]
сообщение промодерировано

Надо периодически сбрасывать содержимое лог-файла в архив.

Вот так мы пишем в лог:

    flock($fh, LOCK_EX);
    seek($fh, 0, SEEK_END);
    print $fh $line."\n";
    flock($fh, LOCK_UN);

А вот сброс в архив с обнулением лога:

    flock(LOG, LOCK_EX) or die "Cannot lock - $!\n";
    seek(LOG, 0, 0);
    open ARC, ">$log_archive" or die "Cannot write - $!\n";
    while(<LOG>) {
        print ARC;
    }
    close ARC;
    seek(LOG, 0, 0);
    truncate(LOG, 0);
    flock(LOG, LOCK_UN);

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

Пробовал играть с типами болировки и буферизацией - безрезультатно (возможно - не тем играл?).
Собственно, если не получится, можно оставить как есть.
Так что вопрос, скорее, чисто спортивный - почему тот же код работает корретно из разных процессов и глючит из родственных?

спустя 2 дня 23 часа [обр] Евгений Седов aka KPbIC(38/176)[досье]
Какая часть данных теряется? Кто является демоном? Как вы отключали буферизацию? Минимальный проблемный код дадите?
спустя 1 день 22 часа [обр] Константин Долгань[досье]
Все, разобрался, тему закрываем.
Решилось блокировкой архива и открытием его на дозапись (>> вместо >).
На архивации из отдельного скрипта это почему-то ни разу никак не отражалось, а в ответвленных процессах оказалось существенным
спустя 4 месяца 1 день [обр] Евгений Седов aka KPbIC(38/176)[досье]
На CPAN'е полно модулей работы с логами. Стоит ли выдумывать свое?
Powered by POEM™ Engine Copyright © 2002-2005