eval { local $SIG{ALRM} = sub { die "alarm timeout" }; alarm $timeout; eval { # operation you're waiting on which might die() }; alarm 0; # cancel the alarm die $@ if $@; }; alarm 0; # race help die $@ if $@ && $@ !~ /alarm timeout/; if ($@) { # Whatever you want on an alarm timeout }