czwartek, 10 kwietnia 2008

At z dokładnością do sekund

Polecenie at uruchomi program w określonym co do minuty momencie. Posługiwanie się at wygląda jakoś tak:


at 17:01
nazwa-polecenia-do-wykonania
Ctrl-D

Powyższe jest przykładem trybu interaktywnego, stąd Ctrl-D na końcu. Można też uruchomić at w następujący sposób: at 19:12 < plik. Polecenie są wtedy wpisane do pliku. Poleceń może być więcej niż jedno.

A jak się chce uruchomić polecenie z dokładnością do sekund, to co wtedy? Oczywiste wyjście to dodać sleep. Inne sposób to dać sobie spokój z at i całość zakodować w Perlu:


#!/bin/perl
use Time::Local;

my $run_time = shift; ## `execution' time, given as: hh:mm:ss
my ($hh, $mm, $ss) = split /:/, $run_time;
print STDERR "Run task at: $hh:$mm:$ss\n";

while (1) {
sleep 1; # preventing the task from running more than once during the 0 second.
while ((localtime(time))[0] != $ss) { sleep 1; }
runTask();
}

sub runTask {
## diff between current and `execution' time
my $tdiff = timelocal($ss, $mm, $hh, (localtime)[3,4,5]) -
timelocal(localtime());
if ($tdiff < 0) { print "Executed!" }
else { print "Will be executed within: $tdiff\n"; }
}

Ideę znalazłem na tym blogu.

Brak komentarzy:

Prześlij komentarz