Код зависает при записи сообщения журнала в текстовый файл из нескольких источников с использованием Perl Script - PullRequest
0 голосов
/ 19 ноября 2018

Я использую приведенный ниже код для записи сообщения журнала в текстовый файл, программа зависает, когда другой источник вызывает этот метод параллельно.Есть ли способ предоставления / контроля параллельной записи без нарушения работы программы.

sub sLog {
    my $self = 'currentServerDirectory';
    my $logMsg = "";

    my $fileName = join '_', $self->{LogFilePrefix}, &sTimeStamp("Log");
    my $absFileName = "$self->{LogFolder}/$fileName.txt";

        open APPHDLER, ">>$absFileName" or &exitErr("Cannot append message to file, $absFileName");
        print APPHDLER scalar(localtime(time))." - $logMsg\n";
        close APPHDLER;
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Попробуйте использовать flock - вот простой пример, который вы можете попытаться понять его поведение:

use strict;
use warnings;
use Fcntl qw/:flock/;

chomp(my $id = `date`);
my $cnt = 0;
while (1) {
    open LOG, ">>shared" or die "Couldn't open shared";
    flock (LOG, LOCK_EX) or die "Couldn't flock";
    print LOG "$id: $cnt\n";
    $cnt++;
    sleep 1;
    close LOG;
}

Скажите, что это сохранено в flock.pl, тогда вы можете запустить flock.pl& для запускаодин или несколько экземпляров в фоновом режиме.Затем сделайте tail -f shared, чтобы увидеть, что происходит.Поскольку вы спите 1 секунду между получением блокировки и ее снятием с помощью close LOG, вы будете обновляться раз в секунду, если у вас есть один процесс.Однако, если у вас есть N процессов, вы увидите, что каждый из них занимает N секунд.

В существующем примере вы можете попробовать добавить строки use Fcntl и flock.

0 голосов
/ 19 ноября 2018

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

...