Newsgroup: it.comp.lang.perl
Titolo: sincronizzare time

Salve,
     data l'assenza di cron sul mio sistema (server web con unix) devo 
scrivere un processo che, una volta lanciato da terminale si stacchi da esso 
e viva di vita propria finchè non verrà killato, ne imiti la sua 
funzionalità.
Ovvero eseguire delle funzioni ad una certa ora di un certo giorno.
Il tutto naturalmente inizia da:
use Proc::Daemon;
use Proc::PID::File;
Proc::Daemon::Init;
exit if ( Proc::PID::File->running( dir => "/tmp") );
while(1)
{
 sleep 5;
}
dato che il mio server risiede in usa il time è sballato, in più problemi 
con ora legale etc, vorrei agganciarmi ad un server ntp italiano, per avere 
ora e data perfetti...sincronizzandosi con esso ogni 5 secs.
per fare questo userei: Net::NTP;
La prima domanda è: un server ntp, ad esempio '
time.ien.it
' accetta varie 
chiamate molto frequenti da uno stesso IP?
Altrimenti ci sarebbe un modo per sincronizzare il time interno di perl ad 
un dato valore?

 ha scritto nel messaggio 
news:49b90d68$0$1128$4faf...@reader1.news.tin.it...


Penso di aver risolto facendo cosě:
[code]
#!/usr/bin/perl
use strict;
use warnings;
use lib 'lib';
use Net::NTP;
use Data::Dumper;
my $time = &_get_ntp_time();
my $k = 0;
while (1)
{
    sleep 5;
    $k = $k + 5;
    my @time = localtime $time + $k;
    print sprintf('%04d/%02d/%02d %02d:%02d:%02d',1900+$time[5], 
++$time[4],@time[3, 2, 1, 0]), " - $k \n";
    $time = &_get_ntp_time() and $k = 0 if $k > (60 * 2);
}
sub _get_ntp_time
{
    my %ntp_data = get_ntp_response('
time.ien.it
');
    return $ntp_data{'Reference Timestamp'};
}
[/code]
In pratica mi collego al server NTP ogni 2 minuti per ri-sincronizzare ... 
dato che tutto quello che viene eseguito internamente al ciclo potrebbe piů 
la sleep potrebbe portare ad un falso time... 

Avrei bisogno di un aiuto per capire come struttura una condizione IF 
secondo questi parametri:
dalle ore 10:00 alle ore 12:30, dal Lunedi al Venerdi
Avendo come riferimento:
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
Quindi dovre fare una cose del genere:
if ( ora => 10:00 and ora <= 12:30 and dayw = (l,m,m,g,v) )
{
 # ...Do the Job
}
qualche suggerimento?
Grazie 



prova con
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime
(time);
my $ora= sprintf("%02d",$hour).sprintf("%02d",$min);
if ( ($wday>=1 and $wday<=5) and ($ora>1000 and $ora<1230) ){
	#dowhateveryouwant
}

 la sleep potrebbe portare ad un falso time...
Va bene essere precisi, ma rompere le scatole al server su 
time.ien.it
ogni due minuti mi sembra un po' eccessivo... Non potresti calcolare
semplicemente l'offset del tuo server rispetto al server di
riferimento, ed utilizzarlo per un mesetto prima di aggiornarlo?
my $time_ntp = prendi_epoch_da_ntp();
my $time_current = time();
my $delta = $time_ntp - $time_current;
Per prendere la epoch da NTP dovrai studiarti la documentazione di
Net::NTP, probabilmente è quel $ntp_data{'Reference Timestamp'} che
hai già utilizzato nel tuo codice.
Ora, ogni volta che chiami localtime():
   my @time = localtime(time() + $delta);
ti darà un tempo ragionevolmente allineato con il server NTP senza
stargli a rompere troppo le scatole.
Ciao,
   Flavio.