my $start = time; sub exec_time { return time - $start } my $yawn; eval { local $SIG{ALRM} = sub { die "alarm\n" }; alarm 5; $yawn = `sleep 3600 ; echo "yawn"`; alarm 0; }; printf "Time: %d\n", exec_time(); print $@ ? 'Timed out.' : 'Finished.'; print "\n"; print "yawn? $yawn\n"; __END__ Time: 5 Timed out. yawn?