use Time::HiRes qw(setitimer ITIMER_VIRTUAL); my $state; $SIG{ALRM} = sub { if ($state == 0) { warn "starting application"; # start application here $state = 1; my $wait_time = 10; # compute time to wait here setitimer(ITIMER_REAL, $wait_time, 0); } else { warn "stopping application"; # stop application here $state = 2; setitimer(ITIMER_REAL, 0, 0); # disable interval timer } }; # wait for 5 seconds before starting app $state = 0; setitimer(ITIMER_REAL, 5, 0); while ($state != 2) { # do other stuff... }