in reply to Multialarm loop

You could spawn a job for each phase. The job for phase 1 would sleep 30 seconds and exit; the phase 2 and phase 3 for 300 and 30000 (?!) seconds, respectively. The master program would wait for some process to finish. As each one does, the master program re-spawns the job and handles the collection.

Or you could just keep an array of phase-time pairs and set an alarm for the next-expiring one:

my @increments = (undef, 30, 300, 30000); my @times = map {($_, time + $increments[$_])} 1..3; alarm($times[0][1]); #... # then in sigalarm, handle and reschedule the next phase my $this_phase = (shift(@times))->[0]; @times = sort { $a->[1] <=> $b[1] } (@times, [$this_phase, $increments +[$this_phase]); alarm($times[0][1]); my_garbage_collect($this_phase);

Caution: Contents may have been coded under pressure.