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 :

commande system sans interruption du script appelant


Sujet :

Langage Perl

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Par défaut commande system sans interruption du script appelant
    Bonjour,

    Je suis entrain d'apprendre à programmer en Perl à l'école. J'ai un projet, je dois réaliser une interface de paramétrage (IHM web avec Dancer) d'un outil de calcul de l'un de mes profs.

    J'ai besoin de lancer un script de calcul qui viendrait calculer les simulations. Problème : une simulation dure en moyenne 1 ou 2 jours ... J'aimerai donc pouvoir le lancer le script de calcul (en lui transmettant l'identifiant de la simulation à calculer) et qu'il aille tout seul taper en base pour prendre les données précédemment paramétrées. Je précise que l'IHM sont complètement séparé seul les données en base les relient.

    system serait parfait mais pour que le processus appelant reprenne, il faut attendre la fin du processus appelé ... J'aimerai une commande équivalente mais sans cette attente ...

    Il est bien sur possible d'appelé le processus de calcul depuis un thread mais je n'en ai jamais utilisé ... Et j'ai l'impression que c'est une solution un peu trop lourde alors que je ne veux que lancer un processus sans attendre qu'il finisse.

    Existe-t-il une tel fonction ou suis-je obligé de passer par un thread ?
    Si je suis obligé de passer par un thread pourriez-vous m'indiquer un tuto ou un exemple assez simple (pour débutant )

    Merci d'avance et bonne journée.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    La fonction exec n'attend pas la fin du processus lancé, mais je ne suis pas sûr que cela convienne, car le programme appelant s'arrête.

    Sinon, la commande system peut peut-être lancer un petit script shell qui lance ta commande en tache de fond (avec le &) et sort immédiatement, ce qui rendra la main à ton script Perl.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Par défaut
    Je viens de tenter deux script minimaliste en perl (détail je suis sous windows dons je ne peux pas faire de shell ... mais le serveur de prod sera sous unix).

    test2.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    system 'test.pl bla &';
     
    for (0..1000){
    	print "test2\n";
    }
    Il appelle test.pl avec le '&'

    et test.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $test = shift; # permet de récupérer le paramètre
     
    for (0..1000){
    	print "\t$test\n";
    }
    J'obtiens d'abord tous les 'bla' et ensuite tous les 'test'. Alors que j'aimerai qu'il s'entre-mêle ... Je crois que sans thread c'est impossible ...

  4. #4
    Membre actif
    Avatar de Grumphette
    Homme Profil pro
    Validation manager
    Inscrit en
    Juillet 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Validation manager

    Informations forums :
    Inscription : Juillet 2008
    Messages : 81
    Par défaut
    Attention ! le fait que l'affichage soit sérialisé, n'implique pas que tes deux scripts ne soit pas exécuté en parallèle.

    L'affichage sur ton terminal reste un buffer, et en cas d'accès concourant (tes deux script qui font font des prints en //) à une ressource unique, en général on se retrouve avec un comportement tout ce qu'il y a de plus aléatoire et rarement ce que l'on veut.

    Si tu t amuse à écrire dans 2 fichiers séparé, au lieu de faire de simple print sur le terminal, avec un time stamping pour chaque écriture dans tes fichiers, tu verra qu'il écrive pratiquement en même temps.

  5. #5
    Membre émérite Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Par défaut
    Bonjour,

    plutot que le threading je pense que pour ton cas un fork() serait adéquate, as tu regardé en ce sens?

    Vu que tu dev sous windows, je pense que beaucoup vont me dire que fork() n'est pas dispo sur cette plateforme ils auraient raison MAIS ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On some platforms such as Windows where the fork() system call is not available, Perl can be built to emulate fork() at the interpreter level...
    Note complete ici
    une solution existe bien !

    Cdlt

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Par défaut
    Effectivement fork est utilisable sous windows, cependant son fonctionnement semble différent de celui que tu décris ...

    D'ailleurs sur la FAQ de ce site, ils disent que :

    Cette fonction permet de créer un processus enfant et de mettre le processus parent (votre programme Perl) en veille en attendant la fin de ce processus enfant.
    J'ai tout de même essayé mais je n'obtiens pas ce que je veux : un processus parent qui lance un processus fils totalement séparé.

    Mon but étant de créer un vrai couplage lâche ... Le seul paramètre dont le processus fils a besoin peut être passé par la commande, pour le reste il se débrouille en allant lire les données en base.

    (le prof qui me demande de faire cette interface ne sait pas du tout coder ... je ne veux pas qu'il mette ces mains dans mon code ... C'est pour cela que je veux que les calculs se fasse dans un *.pl indépendant pour séparer complètement la présentation des calculs).

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 52
    Par défaut
    Bon en fouillant un peu, j'ai pu voir que le threading n'était pas si terrible !

    J'ai fais repris un script minimaliste qui est pas trop mal voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use threads;
    sub boucle {
            my $thread = shift;
            my $toto = 50;
            while($toto--) { print "dans le thread $thread\n" }
            threads->yield;
            $toto = 50;
            while($toto--) { print "dans le thread $thread\n" }
    }
    my $thread1 = threads->new(\&boucle, 'premier');

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Je reste sur mon idée de lancer un script intermédiaire. Si tu ne peux pas le faire en shell, lance un script Perl intermédiaire.

    Le script principal fait un "system" lançant le second script. Le second script fait un "exec" lançant ton programme. Le second script va mourir tout de suite et te rendre la main dans ton script principal. Enfin, à tester sous Windows, je pense que ça va marcher comme cela.

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

Discussions similaires

  1. Suppression espace variable script appel de commande dos
    Par bollam dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 16/08/2010, 15h15
  2. Réponses: 6
    Dernier message: 24/09/2009, 17h44
  3. Réponses: 7
    Dernier message: 11/07/2007, 20h10
  4. Réponses: 10
    Dernier message: 24/01/2007, 23h12

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