Запустите внешнюю команду и обработайте ее файл журнала параллельно - PullRequest
1 голос
/ 22 декабря 2011

Мне нужно запустить внешний инструмент из моего кода Perl. Эта команда работает довольно долго, почти ничего не печатает в STDOUT, но создает файл журнала. Я хотел бы запустить его и параллельно читать и обрабатывать его файл журнала. Как я могу сделать это в Perl?

Заранее спасибо.

1 Ответ

2 голосов
/ 22 декабря 2011

Если вы используете что-то вроде File :: Tail для чтения файла журнала, тогда вы можете выполнить простые fork и exec для запуска внешней команды. Должно работать что-то вроде следующего:

use strict;
use warnings;

use File::Tail;

my $pid = fork;

if ( $pid ) { 
    # in the parent process; open the log file and wait for input
    my $tail = File::Tail->new( '/path/to/logfile.log' );
    while( my $line = $tail->read ) { 
        # do stuff with $line here
        last if $line eq 'done running';  # we need something to escape the loop 
                                          # or it will wait forever for input.
    }
} else { 
    # in the child process, run the external command
    exec 'some_command', 'arg1', 'arg2';
}

# wait for child process to exit and clean it up
my $exit_pid = wait;

Если возникают проблемы с запуском дочернего процесса, код возврата для выхода будет в специальной переменной $?; см. документацию для wait для получения дополнительной информации.

Кроме того, если выходные данные журнала не дают подсказки, когда следует прекратить хвостовой файл, вы можете установить обработчик в $SIG{CHLD}, который будет перехватывать сигнал завершения дочернего процесса и позволит вам выйти из цикла.

...