#!/usr/bin/perl use strict; use warnings; use POSIX ":sys_wait_h"; my $timeout=5; my $output=''; my $cmd=q!perl -e 'for(0..3){print qq(TEST $_\n); warn(qq(TTTT $_\n)); sleep(1); }'!; my $pid=0; eval{ local $/=undef; local $SIG{ALRM}=sub{ kill(9,$pid) if($pid && waitpid($pid, WNOHANG) == 0); die("TIMEOUT ($timeout)\n"); }; $pid=open(my $ph, '-|', $cmd) or die("ERROR START $cmd ($!)\n"); alarm($timeout); $output=<$ph>; alarm(0); close($ph) or die("ERROR END $cmd ($!)\n"); }; if($@) { warn("PROCESS KILLED!\n$@"); $output=''; } if($output) { print "OUTPUT:\n"; print $output; } else { print "NO OUTPUT!\n"; }