my %Jobs = ( Florb => { startup_time=>120, shutdown_time=>45, state=>'stopped', }, Zooki => { startup_time=>60, shutdown_time=>10, state=>'stopped', }, ); while (1) { my $desired_state = get_desired_state(); for my $J (keys %Jobs) { my $job = $Jobs{$J}; if ($$job{state} eq 'stopped') { if ($desired_state eq 'running') { $$job{state} = 'starting'; $$job{time} = time; } } elsif ($$job{state} eq 'running') { if ($desired_state eq 'stopped') { $$job{state} = 'stopping'; $$job{time} = time; } } elsif ($$job{state} eq 'starting') { if ($$job{time} + $$job{startup_time} < time()) { $$job{state} = 'running'; } else { if ($$job{time} + $$job{shutdown_time} < time()) { $$job{state} = 'stopped'; } } # doze a little sleep 10; } }