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

Programmation et administration système Perl Discussion :

[reseaux] Fais dodo, process, mon p'tit père....


Sujet :

Programmation et administration système Perl

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut [reseaux] Fais dodo, process, mon p'tit père....
    Bonjour

    Voici mon problème. Je forke (mother forker !) pour lancer un browser dans mon script perl. Ce que je souhaite, c'est que le process père (ie le script) s'endorme jusqu'à ce que le fils ait se termine.
    Or, d'après mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\mozilla.org\\Mozilla\\mozilla";
    unless (defined ($pid = fork)) {
        die "cannot fork: $!";
    } 
    unless ($pid) {
        system("\"$mozilla\" $url");
        exit;                        # the child stops here
    } 
                                     # Parent continues here
    waitpid($pid, 0);  
     
    print"Finish !";
    Il lance en effet le navigateur MAIS il affiche du même coup "Finish". Donc, comment endormir le père jusqu'à ce que le fils soit mort ?

    @ ++

  2. #2
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Hum alors j'ai deux remarques,

    1/

    ¤ system cree automatiquement un processus enfant et perl dors pendant l'execution de ce processus.

    ¤ ce n'est pas le cas d'exec, donc si tu veux tout controler, je pense qu'il faut mieux utiliser exec.

    2/ ce que je n'arrive pas à faire, c'est capturer les processus en cours... Là je suis sous winows (activerperl) et cygwin... Dans aucun des cas je n'arrive à suivre mes processus... Tu y arrives toi ?

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut Choupi !

    Justement, que j'utilise exec ou system, le résultat est pareil !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\mozilla.org\\Mozilla\\mozilla";
    $statut=fork;
        if ($statut) {
            wait; # Attends dans le processus pere la fin du processus fils.
            print"Finish !";
        }
        else
        {
            exec("\"$mozilla\" $url");
            }
    Même avec ça, mozilla (process fils) s'ouvre mais le père reprend la main et m'affiche Finish !
    Et je suis comme toi, sous Cygwin et ActivePerl.

    @++

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Ouah ! 700 posts !

    @ ++

  5. #5
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Ben en fait, vérification faite, mozilla.exe (ou en tout cas firefox.exe) n'est qu'un "intermédiaire", il se finit instantanément si tu le lance à partir de la console, mais la fenêtre reste... Peut-être devrais-tu essayer de trouver un autre repère pour savoir quand tu as fini, en vérifiant la présence du fichier à copier par exemple, ou quelque chose comme ça.

    --
    Jedaï

  6. #6
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut !

    Mouais, c'est le même problème qu'avec Explorer finalement.
    Bon, je vais me débrouiller autrement dans ce cas.
    Merci du conseil.

    @ ++

  7. #7
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    use POSIX "sys_wait_h";
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\Mozilla Firefox\\firefox.exe";
    my $res;
     
    defined (my $pid = fork) or die "cannot fork: $!";
     
    unless ($pid) {
        exec("\"$mozilla\" $url");
    }
    $res = waitpid($pid,0);
    print "\n$res\n";
    Effectivement ca affiche res ... et le process est considéré comme terminé. Ce problème revient super souvent je trouve. Faudrait essayer de savoir comment y remedier... Vais mailer des profs de progs.

  8. #8
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    J'ai lancé un post : http://www.developpez.net/forums/viewtopic.php?t=220725
    J'espere que ca va nous aider à mieux comprendre ça... On verra bien.

  9. #9
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Ok, je surveille les réponses de ton post et on verra bien.

    @++

  10. #10
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use POSIX "sys_wait_h";
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\Mozilla Firefox\\firefox.exe";
    my $res = 0;
     
    defined (my $pid = fork) or die "cannot fork: $!";
     
    unless ($pid) {
        system("\"$mozilla\" $url");
    }
                                     # Parent continues here
    $res = waitpid($pid,0);
    print "\n$res\n";
    Lancez ca !

    J'obtiens deux valeurs de $res : -1 puis - 3900 .... d'ou vient le premier -1 ? La gestion est tres differente de la plate forme unix.

  11. #11
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Non, l'origine du premier -1 est simple : c'est juste que comme tu utilises un system et pas de else, la partie qui affiche $res est exécuté par le père ET le fils, et -1 est renvoyé par le fils parce qu'il ne peut pas s'attendre lui-même...

    Par contre c'est vrai que sous Unix, il est rare qu'un processus agisse comme mozilla.exe ou explorer.exe, bien que ça soit le cas des démons.
    --
    Jedaï

  12. #12
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Merci pour le else, en fait j'ai compris en lisant le post dans la section windows du forum. Pour avoir un controle de l'application il faut donc passer par autre chose qu'un system/exec... Mais je n'ai aucune idée de comment le faire. . ca me perturbe quand même qu'on ne puisse pas faire ça. Un developpeur perl expert dans le coin ?

  13. #13
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut Choupi !

    J'ai réécrit mon code avec une astuce. Puisque le père reprend la main aussitôt, alors, autant le faire dormir ! Du moins, le temps que dans le processus fils, je puisse faire ce que j'ai à faire (30s, c'est suffisant). Toutefois, je te laisse méditer sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\mozilla.org\\Mozilla\\mozilla";
    unless (defined ($pid = fork)) {
        die "cannot fork: $!";
    }
    unless ($pid) {
        system("\"$mozilla\" $url");
        exit;
    }
     
    sleep(10);
    print"Finish !";
    Tel quel, le processus fils se lance et au bout de 10s, le père t'affiche le message Finish. Je me suis dit, mais alors, autant tuer le fils après ces 10s !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\mozilla.org\\Mozilla\\mozilla";
    unless (defined ($pid = fork)) {
        die "cannot fork: $!";
    }
    unless ($pid) {
        system("\"$mozilla\" $url");
        exit;
    }
     
    sleep(10);
    kill($pid);
    print"Finish !";
    Ô surprise ! Au bout des 10s, le fils n'est pas tué pour autant !
    J'avoue ne plus rien comprendre !

    @ ++

  14. #14
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Bonjour à vous tous et merci de vos réponses.

    Bon, j'avoue que le problème est "partiellement" résolu. En effet, quand je demande au père de pioncer avec sleep pendant que je fais ce que j'ai à faire avec le processus fils, j'arrive à un chouette résultat (cf plus haut).
    Il n'empêche que j'aurais souhaité que le père dorme tant que le fils est actif ! Donc, le thread est marqué résolu mais si vous avez des alternatives, je suis preneur !

    @ ++

  15. #15
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Ben en fait c'est vraiment un problème spécifique à Windows et à certains programmes... Même en utilisant Win32::Job ou associés, je continue à obtenir le même résultat. En fait il semble que ces commandes n'agissent que comme des proxy pour la véritable application, ce qui nous prive de notre contrôle sur eux... Il reste la possibilité d'utiliser un module comme Win32:rocess::Info pour savoir quels processus sont en cours d'exécution, mais c'est un brin fastidieux !!

    (Peut-être Win32::ChangeNotify pourrait-il être intéressant aussi dans ton cas en particulier : il permet de surveiller ce qui arrive à un fichier (un nom de fichier plutôt), s'il est créé, s'il change de taille, etc...)
    --
    Jedaï

  16. #16
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Humm, ça me semble intéressant tout ça ! Peux-tu préciser ta pensée, as-tu des liens à nous conseiller, des extraits de code ?

    @ ++

  17. #17
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    [troll]Encore un souci inhérent à Win [/troll]

  18. #18
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Finalement, je me suis trompé : en fait j'avais fait tous ces tests avec une fenêtre firefox ouverte, et d'un seul coup j'ai eu une inspiration et je me suis dit : "Pourquoi ne pas essayer de recommencer alors que firefox n'est PAS ouvert ?".
    Ô surprise ! J'ai enfin obtenu un résultat correct

    Conclusion : on peut obtenir le résultat souhaité avec ce code pourvu qu'un processus similaire ne soit pas déjà en route :

    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
     
    #!/usr/bin/perl
    use strict;
    use Win32::Job;
     
     
    my($url) = "http://www.wanadoo.fr";
    my($mozilla) = "C:\\Program Files\\Mozilla Firefox\\firefox.exe";
    my $res = 0;
     
        my $job = Win32::Job->new;
        $job->spawn("$mozilla", q{firefox $url});
        my $ok = $job->run(5 * 60, 1);
     
     
    print $ok;
    Hourra !!!

    --
    Jedaï

  19. #19
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut Jedaï

    Ta piste semble être très bonne ! . J'ai toutefois un problème avec ton code. Quand je le lance tel que tu l'as écrit, mozilla se lance avec comme url : www.$url.com !
    Comment peux-tu lui passer la bonne URL ?

    @++

  20. #20
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    C'est bon, j'ai corrigé ton source et ça roule d'enfer !!!
    Un grand merci à toi Jedaï !!!

    @ ++

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Margin fais bouger tous mon bloc.
    Par Shandler dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 27/02/2009, 18h38
  2. [Thread] Fais dodo cola mon ptit thread...
    Par foxdie dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 10/05/2006, 17h58
  3. Process defunct bizarre avec Mon sur mandriva
    Par spynux dans le forum Administration système
    Réponses: 4
    Dernier message: 22/12/2005, 10h32
  4. [reseaux] prog qui lit le process
    Par louloul dans le forum Programmation et administration système
    Réponses: 5
    Dernier message: 25/11/2004, 18h07
  5. Installer mon driver carte reseaux
    Par kaygee dans le forum Matériel
    Réponses: 9
    Dernier message: 26/02/2004, 20h31

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