IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Timeout sur system()


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Timeout sur system()
    Bonjour
    J'ai besoin de lancer une commande avec la fonction system() pour vérifier son code de retour.
    J'ai aussi besoin de mettre un timeout sur cette appel pour tuer le processus

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    eval {
    	local $SIG{ALRM} = sub { die "Alarm" };
    	alarm($getconfs_timeout);
    	system("toto") == 0 || &failexec("Unable to execute\n",$?);
    	alarm(0);
    };
     
    if ($@ and $@ =~ /Alarm/) {
    	&timeoutexec("Timeout sent\n");	
    } else {
    mais cela créé des zombies

    existe t'il un moyen simple (sans install de librairies) pour faire celà ?
    j'imagine que le fork est obligatoire mais je les maitrise pas très bien

    j'ai essayé çà mais celà n'est pas concluant (je ne sais pas comment tuer un des fils quand l'autre est fini)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/usr/bin/perl
    $timeout=30;
     
    &NewPid();
     
     
    sub NewPid(){
      defined($pid1 = fork) or die "Pas de fork1 possible : $!";
      defined($pid2 = fork) or die "Pas de fork2 possible : $!";
      unless($pid1){
        print "Lancement sh\n";
        exec("/var/www/html/outilsecurite/script/cdegetconfs.sh");
        exit 0;
      }
      unless($pid2){
        $time=$timeout;
        while($time>0)
        {
          system("cls");
          print "Il vous reste: $time secondes\n";
          $time=&Decompte($time);
        }
        exit 0;
      }
     
      waitpid($pid2, 0);
      waitpid($pid1, 0);
     
     
    }
     
    sub Decompte(){
      $decompte=$_[0];
      $decompte=$decompte-1;
      sleep(1);
      return $decompte;
    }
    Dernière modification par Invité ; 09/07/2007 à 09h54.

  2. #2
    Invité
    Invité(e)
    Par défaut
    après pas mal de recherche, j'ai adapté le code suivant qui semble répondre à mes besoins. Qu'en pensez vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/perl
     
    use strict;
     
    my $time = 5;
    my $pid;
     
    local $SIG {ALRM} = sub {die "Timeout";kill 15, $pid;}; # Just SIGTERM.
     
    eval {
      $pid = fork;
     
      die "Fork failed: $!" unless defined $pid;
     
      unless ($pid) {
        system('/home/toto.sh')==0 || &failexec($$); ;
      }
      alarm $time;
     
      waitpid $pid => 0;
    };
    if ($@ && $@ !~ /^Timeout/){
      print "Time out\n";
      die $@ ; 
    }
     
    1;
     
    sub failexec {
    	my ($pid) = @_;
    	kill 15, $pid or die "kill: $!";die "Plantage";
    }
    EDIT : zut, celà ne tue pas le processus fils de system()

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Dans ton fork fait un exec(), pas un system().

    --
    Jedaï

  4. #4
    Invité
    Invité(e)
    Par défaut
    mon problème c'est que j'ai besoin de connaitre la valeur retournée par mon script toto.sh ce que ne permet pas exec()

    la je réussi à tuer le processus père mais le fils créé par system tourne toujours

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Si tu réussis ton waitpid(), le status retourné par la commande dans le exec() sera dans $? (ou presque, consulte perlvar pour plus de détail sur $?).

    --
    Jedaï

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup (je débute en perl)

    Mon code marche maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #!/usr/bin/perl
     
    use strict;
     
    my $time = 1;
    my $pid;
     
    local $SIG {ALRM} = sub {
                              kill 15, $pid ;
                              die "Timeout\n";
                              };
    eval {
      $pid = fork;
     
      die "Fork failed: $!" unless defined $pid;
     
      unless ($pid) {
        exec('/home/toto.sh');
        die "Commande failed\n";
      }
      alarm $time;
      waitpid $pid => 0;
    };
    if ($@ and $@ =~ "Timeout\n"){
      die $@;
    }elsif(($? >> 8)){
      die "Plantage ".($? >> 8)."\n";
    }else{
      print "Tout est OK\n";
    }
    1;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C system] timeout sur un processus
    Par GLDavid dans le forum POSIX
    Réponses: 7
    Dernier message: 03/07/2006, 09h01
  2. Timeout sur POST formulaire avec checkbox
    Par shyangel dans le forum Langage
    Réponses: 16
    Dernier message: 11/05/2006, 12h59
  3. Timeout sur read() avec termios et VTIME
    Par olivier857 dans le forum C
    Réponses: 9
    Dernier message: 05/04/2006, 09h30
  4. [Système] pb sur system()
    Par Shandler dans le forum Langage
    Réponses: 4
    Dernier message: 17/01/2006, 14h28
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo