$SIG{ALRM} = sub { die "TIMEOUT" }; eval { alarm(ON); open COMMAND, "$command |" or die "Can't fork: $!\n"; $output .= $_ while (); close COMMAND or die "Can't close pipe: $!\n"; alarm(OFF); }; if ($@ =~ /TIMEOUT/) { # do stuff } #### open COMMAND, "$command |" or die "Can't fork: $!\n"; eval { alarm(ON); $output .= $_ while (); alarm(OFF); }; close COMMAND; #notice no 'or die stuff' here anymore