Вы можете свернуть свое собственное решение, используя интерфейс системных вызовов Perl, но проще использовать встроенный модуль IPC :: Open3. Что касается вашего списка:
Запустить внешний процесс:
use IPC::Open3;
use IO::Handle;
use strict;
my $stdout = IO::Handle->new;
my $stderr = IO::Handle->new;
my $pid = open3(undef, $stdout, $stderr, 'my-command', 'arg1', 'arg2');
Читайте STDOUT и STDERR отдельно, произвольное количество байтов за раз:
my $line = <$stdout>;
# Or
sysread $stderr, my $buffer, 1024;
Определить, когда процесс завершится:
use POSIX qw(sys_wait_h);
waitpid $pid, 0; # Waits for process to terminate
waitpid $pid, WNOHANG; # Checks if the process has terminated
Получить код завершения процесса:
my $status = $?; # After waitpid indicates the process has exited
Обязательно прочитайте документацию по IPC :: Open3; как он предупреждает, легко оказаться в тупике, если у вас есть раздельные каналы stdout и stderr, если вы не будете осторожны. Если дочерний процесс заполняет любой канал, он блокируется, а если родительский процесс читает другой канал, он будет блокировать.