use Sys::SigAction qw( set_sig_handler ); eval { my $h = set_sig_handler( 'ALRM' ,sub { die "TIMEOUT\n"; }, { mask=>[ 'ALRM' ], safe=>1, }); eval { alarm 3; $opened= open my $check, '-|', 'sleep 60'; if ($opened) { # slurp its output $line= do { local $/; <$check>; }; $exit_code= $!+0; $closed= close $check; } alarm 0; }; alarm 0; die $@ if $@; }; alarm 0; print $@;