Bonjour,
J'ai un problème en Perl que je n'arrive pas à résoudre.
J'ai besoin de lancer une commande (en fait mon script perl gère un lot et lance la commande en séquence sur chaque élément du lot), et de l'arrêter si elle prend trop de temps.
J'ai creusé plusieurs méthodes, donc la plus "propre" semble être l'utilisation de alarm et die, mais ça ne marche pas dans mon cas.
Voici le code de "test" de la méthode, modifiée pour mon usage, à partir du code qu'on peut trouver un peu partout sur le net :
Code :
- #!/usr/bin/perl -w
- $gcom = "<ma commande>";
- $time = 5;
- sub execCom {
- $com = $_[0];
- eval {
- local $SIG{ALRM} = sub { die "$com est parti en boucle\n" };
- alarm $time;
- system($com);
- alarm 0;
- };
- if ($@) {
- die "#3xyz# : $@\n";
- # délai dépassé : time out
- } else {
- # délai non dépassé
- print "#8xyz# : Délai non dépassé\n";
- }
- }
- system ("touch 1.t" );
- &execCom("$gcom" );
- system ("touch 2.t" );
- &execCom("$gcom" );
- system ("touch 3.t" );
- &execCom("$gcom" );
- system ("touch 4.t" );
- &execCom("$gcom" );
- system ("touch fin.t" );
- system ("ll -rt *.t" );
|
Au final, seule la première commande est exécutée (les lignes 28 et 29). Elle dépasse le timeout, mais n'est pas arrêtée... Les lignes suivantes (30 et +) ne sont jamais exécutées.
Quelqu'un pourrait m'expliquer ?
J'ai aussi regardé du côté de "ulimit" en bash/sh et "limit cputime" en csh/tcsh, mais je me trouve face à un comportement étrange, et surtout, des impossibilité de changer les valeurs... De plus comme c'est dépendant du shell, j'ai moins confiance.
Merci de m'aider
Message édité par Predicator le 30-05-2008 à 11:45:10