Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Блокировка файла в родственных процессах


Автор: kond 24.5.2013, 14:08
Надо периодически сбрасывать содержимое лог-файла в архив.

Вот так мы пишем в лог:
     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);

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)