sub cmd_wrapper { my $timeout = shift; my $cmd = shift; my @out; # all lines of output my $return_code; eval { local $SIG{ALRM} = sub { die "alarm\n" }; alarm $timeout; @out = (`$cmd`); $return_code = $?; alarm 0; }; if( $@ ) { die "Eval failed for $cmd for unknown/unexpected reasons" if $@ ne "alarm\n"; die "Eval failed for $cmd because alarm timed out"; } die "Return code undefined for $cmd" unless defined $return_code; return $return_code, @out if wantarray; return $return_code; } @cmdoutput = cmd_wrapper(15, "my_stubborn_shell -c $filename"); # Will timeout in 15 seconds $cmd_ret_code = shift @cmdoutput;