#!/usr/bin/perl use strict; use warnings; use IO::Select (); use IPC::Open3 qw( open3 ); $|++; my $BLOCK_SIZE = 1024; my $script = shift; my $pid = open3(undef, \*OUT, \*ERR, "./$script @ARGV"); my $r_sel = IO::Select->new(\*OUT, \*ERR); my $out = ''; my $err = ''; MAIN_LOOP: for (;;) { my @r = $r_sel->can_read(); foreach (@r) { last MAIN_LOOP if eof($_); my $dp = ($_ == \*OUT ? \$out : \$err); 1 while read($_, $$dp, $BLOCK_SIZE, length($$dp)); } } waitpid($pid, 0); # Reap child. print("STDOUT: $out\n"); print("STDERR: $err\n");