Lancer script avec redondance [Resolu]

Lancer script avec redondance [Resolu] - Perl - Programmation

Marsh Posté le 15-04-2015 à 08:54:50    

Bonjour à tous,  
J'ai une question sans doute simple, mais dont je ne trouve pas réponse pour l'instant...
 
Je veux lancer un script Perl de façon cyclique (toute les secondes) et je ne peux pas utiliser le plannif. de taches sous Windows.
 
Gilou m'avais donné un bout de script avec un "cron" etje ne me rappelle pas comment il s'utilise et s'il est possible de faire un lancement à la seconde...
 
Voici le bout de code de Gilou :
 

Code :
  1. # Programme principal
  2. use AnyEvent::DateTime::Cron;
  3. session();
  4. # boucle infinie, a stopper avec un kill
  5. # remplacer le '* * * * *' par 'mm hh * * *' pour un log tous les jours a hh:mm
  6. my $cron = AnyEvent::DateTime::Cron->new();
  7. $cron->add( '*/3 * * * *' => &session ); # toutes les 3 minutes, pour tester
  8. $cron->start->recv;


 
Existe-t-il un autre moyen de lancer les scripts de façon cyclique ou est-ce que je reste sur cet outil ?  
 
Je vous remercie pour votre aide


Message édité par clubber43 le 21-04-2015 à 09:01:20

---------------
Merci
Reply

Marsh Posté le 15-04-2015 à 08:54:50   

Reply

Marsh Posté le 16-04-2015 à 12:27:27    

La résolution pour cron est de l'ordre de la minute, donc ça ne marchera pas.
Avant de vouloir lancer un script toutes les secondes, as tu vérifié le temps d'exécution dudit script?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-04-2015 à 09:55:31    

OUi GIlou,  
il dure environ 0.8 à 0.9 secondes.
AU mieux, je peux le lancer toute les 2 secondes, ce problème ne sera pas génant.
 
Mais du coup si cron ne marche pas, je peux pas utiliser non plus le plannif de tache qui lui aussi
a une résolution de 5 minutes je crois (windows XP)...
Et en créant une boucle dans mon main, je peux appeler le programme automatiquement ??
 
Merci Gilou.
 
@+


---------------
Merci
Reply

Marsh Posté le 20-04-2015 à 14:45:12    

Le plus simple dans ce cas pour toi c'est de faire un truc genre
 
while (1) {
       # ton code
       sleep 2; # on attends 2 secondes
}
 
ou une variante du même genre:
 
my $interval = 2;  # toute les 2 secondes
for (;;) {
    my $start = time;
    # ton code
    if ((my $remaining = $interval - (time - $start)) > 0) {
        sleep $remaining; # on n'attends que le nombre de secondes restantes
    }
}
 
Ça a les avantages et les inconvénients d'un code bloquant avec sleep.
 
Si ça dure moins d'une seconde, tu peux utiliser Time::HiRes et faire les calculs en microsecondes.
 
A+,


Message édité par gilou le 20-04-2015 à 14:54:08

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-04-2015 à 21:23:23    

Merci Gilou pour ton aide.
Pour finir le code, je fais un ctrl+C pour  arreter le code ?
 
 
Je vais méditer dessus et faire des essais demain matin.
 
@+


---------------
Merci
Reply

Marsh Posté le 21-04-2015 à 03:27:01    

clubber43 a écrit :

Merci Gilou pour ton aide.
Pour finir le code, je fais un ctrl+C pour  arreter le code ?

Par exemple, ou sinon tu interceptes un signal autre qui met un flag a true, et c'est ce flag qui fait sortir de la boucle.
Bon, les handlers de signal en perl, ça marche bien sous unix, sous windows, ça peut révéler des surprises (en particulier si c'est un ctrl-c qui est intercepté, par expérience, j'évite), et il vaut mieux bien tester.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-04-2015 à 08:16:01    

Ok. Merci pour ton retour Gilou
 
@+


---------------
Merci
Reply

Marsh Posté le 21-04-2015 à 09:01:05    

C'est bon, script testé et validé :)
Merci Gilou pour le bout de code !!
 
Merci
@+


---------------
Merci
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed