#!perl.exe use strict; use warnings; use threads; use threads::shared; use Data::Dumper; use IPC::Open3; use Symbol; my %data : shared; my $timeout = 3; my $command = "perl test.pl"; my $tid = threads->create(sub { execute($command) }); while (--$timeout) { if ($tid->is_joinable) { $tid->join; last; } sleep 1; } if ($timeout == 0) { if ($data{pid}) { kill -9, $data{pid}; } $tid->detach; $data{timedout} = 1; } print Dumper(\%data); sub execute { my $in = Symbol::gensym(); my $out = Symbol::gensym(); my $err = Symbol::gensym(); my $pid = open3($in, $out, $err, @_); close $in; $data{pid} = $pid; # sorry for that dirty handling of $out and $err :-) # it was just a hack for tests $data{stdout} = do { local $/; <$out> }; $data{stderr} = do { local $/; <$err> }; close $out; close $err; threads->exit; }