Если вы используете что-то вроде 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}
, который будет перехватывать сигнал завершения дочернего процесса и позволит вам выйти из цикла.