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

Modules Perl Discussion :

procédure background unix


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 68
    Par défaut procédure background unix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    print FICH_CFG_TMP "$LINE_FICH[0];$LINE_FICH[1];$LINE_FICH[2];$LINE_FICH[3];$LINE_FICH[4];C;$LINE_FICH[6]";
                    $COMMAND="$PATH_SCRIPT/tools/lance_dtmep.pl $LINE_FICH[0] > $PATH_SCRIPT/log/$LINE_FICH[0].result";
                    $timeout_system=(600,$COMMAND);
                    Proc::Background->new($COMMAND);
    J'utilise le module background de perl et je met un timeout de 600. Hors je me retrouve à chaque fois avec des defunct ( zombies ) , quelqu'un a t'il trouvé une solution et déjà utilisé ce module
    ou alors quelqu'un a t'il une autre commande qui ne produit pas cela ( system, signo.

  2. #2
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Avec un fork

    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
     
     
    my $pid = fork();
     
    if (!(defined($pid))) {
        die("fork impossible $!\n");
    }
    elsif ($pid == 0) {
        print("[fils] Je suis le fils !");
        system("$command");
        print("[fils] J'ai executé la commande, je ne sers plus à rien !");
        exit;
    }
     
    print("[père] Je suis le père et je continue ma route");

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    mollux, que cherche tu a faire avec cette ligne ?
    $timeout_system=(600,$COMMAND);

    d'apres la doc de cpan, le new te retourne un objet, et il faut faire un wait dessus (methode) a la fin pour qu'il soit correctement supprimé

    timeout_system est une fonction que tu peux eventuellement utiliser à la place du new, mais tu perds alors tout l'interet du module puisqu'elle va bloquer jusuq'à la fin du process (donc pas background pour un sou)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 68
    Par défaut
    concernant MarneusCalgarXP, sa remarque n'est pas valide, je veux lancer le process en tache de fond et qu'il ne part pas en defunct quand il est finit, avec sa commande , cela ne part pas en tache de fond.

    Concernant ta reparque judicieuse, pour moi le timeout était un moyen de faire un kill après 600 s mais même en lacant celui ci en tache de fond. Je viens de tester et tu as raison.

    Ceci dit, cela ne resoud toujours pas mon problème.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    ce que MarneusCalgarXP t'a montré c'est presque exactement ce que fait le module en question sous le capot (sous unix en tous cas)

    pour eviter le defunc il faut que tu fasse un wait sur ton process (à la fin de ton script par exemple)
    l'autre possibilité serait de tenter un $SIG{CHLD} = 'IGNORE' mais je ne sais pas si ca marchera ici (et ca ne sera plus portable sur autre chose qu'un unix en tous cas)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 68
    Par défaut
    j'ai trouvé en testant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $proc = Proc::Background->new($COMMAND);
                    @CMD_ENCOURS = (@CMD_ENCOURS,$proc);
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            foreach $CMD_ENCOURS (@CMD_ENCOURS)
            {
                    if ( ! ( $CMD_ENCOURS->alive ) ) { $CMD_ENCOURS->die; ecrit_log "INFO :  KILL du process commande $CMD_ENCOURS"; @CMD_ENCOURS= grep /$CMD_ENCOURS/,@CMD_ENCOURS; }
            }

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

Discussions similaires

  1. Erreur 233 during the login process
    Par olibara dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/01/2012, 21h58
  2. appel de proc stock dans shells unix
    Par fguigui dans le forum Oracle
    Réponses: 20
    Dernier message: 05/04/2007, 14h05
  3. Lancement d'un shell Unix dans un proc stockée
    Par Titouf dans le forum Oracle
    Réponses: 1
    Dernier message: 17/10/2006, 11h55
  4. Lancement d'un shell Unix dans un proc stockée
    Par SBA03 dans le forum Oracle
    Réponses: 20
    Dernier message: 31/08/2006, 09h22
  5. Background d'un script php avec perl et unix (ou linux)
    Par fichiertempo dans le forum Web
    Réponses: 4
    Dernier message: 20/07/2006, 07h03

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