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 :

Démarrer et arrêter un script depuis un autre (daemon?)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 12
    Par défaut Démarrer et arrêter un script depuis un autre (daemon?)
    Bonjour à tous,

    J'ai déjà lu quelques sujets sur le forum à ce propos, mais je n'y trouve pas ma réponse.

    Depuis un script, je désire en démarrer un autre, sans que ca n'interrompe le premier. Par la suite, j'aimerais également pouvoir arrêter le script.

    Si j'ai bien compris, il s'agit de faire un fork. Cependant, je n'arrive pas à mon but.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub startprog {
     FORK:{
        my $pid;
        if ($pid=fork) {
    	return "start";
        } elsif (defined $pid) {
          system('perl monprog.pl');
          exit(0);
        } else {
          return -1;
        }
      }
    }
    En effet, ce code démarre bien mon script monprog.pl, mais ne continue pas le script parent (n'affiche pas start tant que monprog.pl fonctionne).

    Le terminal qui s'ouvre pour monprog.pl s'affiche en premier plan, y'a-t-il un moyen de masquer la fenetre en arrière plan?

    Pouvez-vous me donner des pistes pour l'arrêt du programme ?

    Petite précision peut-être utile : je travaille sous ActivePerl (Windows).

    Merci d'avance! Et bon week-end!

    Lily

  2. #2
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    A mon avis, il te manque un waitpid(), regarde là dans la FAQ.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 12
    Par défaut
    Merci pour ta réponse!

    J'ai lu la FAQ, mais le problème, c'est que je ne veux justement pas que mon processus père attende la fin du processus fils. Si j'ai bien compris, le waitpid attend la fin du fils. Or, j'aimerais qu'au moment ou le processus fils démarre, le processus père affiche "start". Donc que mes deux processus fonctionnent en parallèle, sans attendre la fin l'un de l'autre.

  4. #4
    Membre Expert
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Salut,

    Ce que tu pourrais faire, c'est utiliser les threads pour ce genre de choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use threads;
     
    my $thr=threads->new( sub {system('perl monprog.pl')} ); #Générer le thread
    $thr->detach; #Indique qu'on ignore le trhead thr
     
    #actions
    Dis nous si ce code te convient

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 12
    Par défaut
    Merci!

    J'ai testé, mais je n'arrive toujours pas à mon résultat espéré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub startprog {
     
    my $cmd = 'perl monprog.pl';
     
    my $thr=threads->new( sub {exec($cmd)} ); #Générer le thread
    $thr->detach; #Indique qu'on ignore le trhead thr
     
    return "start";
     
    }
    Maintenant j'ai le "start" qui s'affiche, mais monprog.pl n'est plus executé. Pouvez-vous m'éclairer ? Merci!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 12
    Par défaut
    En faisant divers tests, je m'appercois que mon programme s'execute de la même façon que je fasse le fork ou non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sub startprog {
     
    my $cmd = 'perl monprog.pl';
     
    	system($cmd);
     
    return "Start";
     
    }
    Ce code produit exactement la meme chose que celui que j'ai montré au début du sujet. Cela signifie donc que le fork ne fonctionne pas ? Quelqu'un peut-il m'expliquer ?

    Merci!

  7. #7
    Membre averti
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Il te suffit de lancer le script en tache de fond comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    system ("commande param1 param2 &") ;
    Il est important que tu passes tes paramètres avec la commande dans une seule chaine de caractère et non pas sous forme de liste, faute de quoi il n'y aura pas d'interprétation par le shell, et donc le script ne sera pas lancé en arrière plan ...

  8. #8
    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
    Citation Envoyé par ankou29666 Voir le message
    Il te suffit de lancer le script en tache de fond comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    system ("commande param1 param2 &") ;
    Il est important que tu passes tes paramètres avec la commande dans une seule chaine de caractère et non pas sous forme de liste, faute de quoi il n'y aura pas d'interprétation par le shell, et donc le script ne sera pas lancé en arrière plan ...
    Oui, enfin sous Windows ça marche moins bien...

    Bon par ailleurs pour ce qui est de la solution par thread, il ne faut pas que tu le détaches, car en Perl quand le thread principal meurt, les autres threads meurent avec lui. Fait plutôt un join() à la fin de ton script.

    --
    Jedaï

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

Discussions similaires

  1. "Piloter" script depuis un autre script
    Par Arcangedu31 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/06/2013, 11h41
  2. Réponses: 0
    Dernier message: 19/12/2011, 15h51
  3. [MySQL] appeler un script depuis un autre serveur et retourner un lien
    Par taka10 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/01/2011, 14h45
  4. Appeler un autre script depuis un script
    Par Foub dans le forum ANT
    Réponses: 5
    Dernier message: 18/07/2007, 10h32
  5. Réponses: 15
    Dernier message: 22/12/2006, 15h02

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