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

Shell et commandes GNU Discussion :

Lancer des shells en parallèle et attendre leur fin


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut Lancer des shells en parallèle et attendre leur fin
    J'ai un shell "fédérateur" qui en lance plusieurs pour faire des sauvegardes dans tous les sens.

    A ce jour, je lance les différents éléments séquentiellement mais je suis certain qu'en faisant ce que je propose ci-dessous je vais gagner du temps sur l'exécution de l'ensemble car les goulots d'étranglement ne sont pas les mêmes selon les cas.

    La structure de ce shell est la suivante :


    1. Sauvegarde de $home vers disque USB ==> attendre la fin
    2. Sauvegarde du disque USB vers "cloud" local et sauvegarde du disque USB vers "cloud" distant en parallèle ==> Attendre la fin de la plus lente des tâches
    3. Sauvegarde des machines virtuelles vers $home et récupération des sites Internet via lftp vers $home en parallèle ==> Attendre la fin de la plus lente des tâches
    4. Envoi de la log générée via smtp en ligne de commande (bien sûr)


    Je me heurte actuellement à deux problèmes, même si je pense avoir résolu le premier :


    1. Lancement en parallèle de deux tâches : semble marcher en les séparant par "&"
    2. Attendre que la tâche (ou l'ensemble des tâches parallélisées) soit terminées avant de passer à la ligne suivante : Là, j'ai un gros problème de connaissance


    D'avance merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Salut,
    Citation Envoyé par Aenean Voir le message
    Je me heurte actuellement à deux problèmes, même si je pense avoir résolu le premier :
    1. Lancement en parallèle de deux tâches : semble marcher en les séparant par "&"
    2. Attendre que la tâche (ou l'ensemble des tâches parallélisées) soit terminées avant de passer à la ligne suivante : Là, j'ai un gros problème de connaissance
    Mouais, ligne 1 c'est presque bon : semble marcher en les séparant par "&" --> semble fonctionne en terminant la ligne par "&", qui est l'ordre de mise en tâche de fond -- oui, je chipote, on va voir pourquoi + bas.


    Bon, on a un petit problème de sémantique, là, rien qu'en se cantonnant aux deux premières lignes :
    1. Sauvegarde de $home vers disque USB ==> attendre la fin
    2. Sauvegarde du disque USB vers "cloud" local et sauvegarde du disque USB vers "cloud" distant en parallèle ==> Attendre la fin de la plus lente des tâches

    Ça veut dire quoi, "==> attendre la fin" sur la 1re ligne ?
    Ce n'est pas ce qui se passe ? Pourtant tu sauvegardes $home vers dd usb et tu attends que ça soit fini pour passer à la suite ? Auquel cas ça ne sert à rien de l'indiquer, c'est le fonctionnement normal et tout le monde avait compris. Bref c'est pas clair...
    Parce que la ligne 2 a presque le même commentaire au bout mais là les questions se posent : c'est ce qui se passe (je ne vois pas comment) ? C'est ce que tu voudrais ?

    Alors pour attendre la fin de la plus lente des tâches, je pense qu'il faut "emballer" chaque tâche dans un script, les lancer chacun en tâche de fond avec "&", récupérer les PID et ton script fédérateur va boucler sur ces PID tant qu'il y en a un qui existe : quand il n'y en a plus c'est que la plus lente a terminé.

    Indépendamment de cette étape 2 (sauvegarde du dd usb vers deux cibles différentes = accès concurrentiels, je sais pas trop comment le système va réagir à ça, àmha tu vas au pâté dans le mur, là...), il me semble que l'étape 3 devrait être la première : on récupère vers $home puis on sauve $home vers usb puis on sauve usb vers local puis vers nuage. Et enfin on maile le log.
    Nan ?

    Allez, remets tout ça en forme, on a vu qu'il y avait des points pas clairs...

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Alors pour attendre la fin de la plus lente des tâches, je pense qu'il faut "emballer" chaque tâche dans un script, les lancer chacun en tâche de fond avec "&", récupérer les PID et ton script fédérateur va boucler sur ces PID tant qu'il y en a un qui existe : quand il n'y en a plus c'est que la plus lente a terminé.
    En bash, il y a une instruction toute faite pour ça: wait.
    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
    #/bin/bash
     
    Sauvegarde de $home vers disque USB
    # ==> attendre la fin avant de passer à la ligne suivante
     
    Sauvegarde du disque USB vers "cloud" local  &
    # Récupérer le pid de la tâche
    pid1=$!
     
    sauvegarde du disque USB vers "cloud" distant  &
    # Récupérer le pid de la tâche
    pid2=$!
     
    # ==> Attendre la fin de la plus lente des tâches
    wait $pid1 $pid2
     
    Sauvegarde des machines virtuelles vers $home &
    # Récupérer le pid de la tâche
    pid1=$!
     
    récupération des sites Internet via lftp vers $home &
    # Récupérer le pid de la tâche
    pid2=$!
     
    # ==> Attendre la fin de la plus lente des tâches
    wait $pid1 $pid2
     
    Envoi de la log générée via smtp

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/06/2014, 19h55
  2. Lancer des logiciels en parallèle
    Par michel42 dans le forum Général Python
    Réponses: 6
    Dernier message: 03/04/2012, 23h15
  3. [Dates] Appeler des fonctions sans attendre leurs résultats
    Par ipeteivince dans le forum Langage
    Réponses: 6
    Dernier message: 05/02/2008, 12h22
  4. Réponses: 7
    Dernier message: 31/08/2006, 18h03
  5. Lancer des shell unix pour creation d'objet ORACLE
    Par sygale dans le forum Administration
    Réponses: 6
    Dernier message: 27/10/2004, 18h03

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