my $exit; local $SIG{INT} = local $SIG{TERM} = sub { $exit = 1; }; my $wakeup_time = time + 60*60; for (;;) { if ($exit) { ... exit(0); } my $sleep_dur = $wakeup_time - time; last if $sleep_dur <= 0; sleep($sleep_dur); }