use strict; use warnings; use 5.010; use List::Util qw{ shuffle }; my $interval = 2; #seconds my $total_time = 1; #minutes my $num_checks = ($total_time * 60) / $interval; my $start_time = time; my @status = ('up') x 9; push @status, 'down'; #1 in 10 chance server will be down $| = 1; MONITOR_STATUS_LOOP: for (1 .. $num_checks) { my $result = (shuffle @status)[0]; say $result; my $elapsed_time = time - $start_time; say "time left: ", $total_time * 60 - $elapsed_time, " seconds"; last MONITOR_STATUS_LOOP if $result eq 'down'; sleep $interval; } say "on with the rest of the script"; --output:-- up time left: 60 seconds up time left: 58 seconds up time left: 56 seconds down time left: 54 seconds on with the rest of the script