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 :

Fin des processus en parallèle


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 31
    Par défaut Fin des processus en parallèle
    Bonjour à tous,
    J'ai concocté un programme tout bête permettant de lancer des commandes en parallèle. Il fonctionne parfaitement bien mais j'aurai voulu l'optimiser.

    Voici mon "soucis"

    Le script lance deux commandes simultanément comme ceci :

    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
     
    echo "Lancement de la chaine 1"
    nohup lancechaine.ksh -c 1 > $LOGS/ALIM_TABLES_1.log &
    PID_1=$!
    RETOUR_1=$?
    sleep 5
     
    echo "Lancement de la chaine 2"
    nohup lancechaine.ksh -c 2 > $LOGS/ALIM_TABLES_2.log &
    PID_2=$!
    RETOUR_2=$?
     
    printf "\nJOBS EN COURS\n"
     
    wait ${PID_1}
    echo "Chaine 1 termine : CODE RETOUR ${RETOUR_1}"
    echo "Resultats du traitement : $LOGS/ALIM_TABLES_1.log"
     
    wait ${PID_2}
    echo "Chaine 2 termine : CODE RETOUR ${RETOUR_2}"
    echo "Resultats du traitement : $LOGS/ALIM_TABLES_2.log"
    Bon, ne faites pas attention à la qualité du code. Evidemment, une optimisation est à prévoir mais ce n'est pas le problème

    Le soucis est le suivant : il se peut que la chaîne 2 se termine avant la première. Dans ce cas, il faudrait que le message concernant la deuxième chaîne s'affiche dès qu'elle terminée.

    Dans mon code, le message s'affichera dès que le processus 1 sera terminé. En gros je voulais savoir s'il était possible de boucler indéfiniment sur les processus en cours et d'afficher un message dès qu'une des chaînes se termine.

    Evidemment, mon code contient une trentaine de chaîne ce qui est bien plus pertinent.

    N'hésitez pas à me faire préciser des points qui n'ont pas été clair.

    Merci pour votre contribution

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Voilà une façon de traiter les fins de jobs en parallèle:
    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
    29
    jobCount=30
    command="lancechaine.ksh -c"
    logPrefix=log/alim_tables
    interval=5
     
    for ((job=0;job<jobCount;job++)); do
      echo "Lancement de la chaîne $job"
      nohup $command $job > ${logPrefix}_${job}.log 2>&1 &
      jobs[$job]=$!
      sleep $interval
    done
     
    printf "\n%s jobs lancés\n" $jobCount
     
    while true; do
      running=0
      for ((job=0;job<jobCount;job++)); do
        if [ ${jobs[$job]} != 0 ]; then
          kill -0 ${jobs[$job]} 2>/dev/null && running=$((running+1)) || {
            jobs[$job]=0
            echo "Chaîne $job terminée"
            echo "Résultat du traitement :${logPrefix}_${job}.log"
          }
        fi
      done
      [ $running = 0 ] && break
      echo "$running jobs en cours d'exécution"
      sleep 1
    done
    J'ai supprimé la partie traitant du code retour qui n'est par pertinent pour une commande en arrière plan. Il faudrait que la commande lancechaine.ksh se débrouille pour fournir son propre code retour au script, par exemple en le stockant dans un fichier.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    apparemment le code st toujours le même, tu gagnerais à utiliser une fonction, qui, elle, sera appelé autant de fois en arrière plan, et qui contiendrait le texte à afficher.

    pour ton information, les commandes en arrière plan ont toujours un code de retour valant 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    false & (($?)) && echo KO || echo ok
    ok
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 31
    Par défaut
    Super merci beaucoup jlliagre. Ca fonctionne parfaitement. Je vais voir pour le code retour, mais le lancechaine.ksh lance un autre script. Je pense que ça va être compliqué de récupérer ce code sachant que je n'ai pas la main sur les autres scripts (propriétaires)

    N_BaH, comme je le disais dans mon premier message, la boucle n'était pas encore développée (D'ailleurs merci à jlliagre qui m'a mâché le travail ). En tout cas, merci pour l'info

    Je passe le post à RESOLU

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Citation Envoyé par Bonjovi51
    Je vais voir pour le code retour [...] ça va être compliqué de récupérer ce code[...]
    Citation Envoyé par N_BaH
    les commandes en arrière plan ont toujours un code de retour valant 0
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par Bonjovi51 Voir le message
    Je vais voir pour le code retour, mais le lancechaine.ksh lance un autre script. Je pense que ça va être compliqué de récupérer ce code sachant que je n'ai pas la main sur les autres scripts (propriétaires)
    Pas besoin d'avoir la main sur les autres scripts, il suffit de récupérer ce code dans lancechaine.ksh et de le sauvegarder, par exemple dans le répertoire de logs.

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

Discussions similaires

  1. détection de la fin des processus fils
    Par SoftAbdou dans le forum Linux
    Réponses: 6
    Dernier message: 15/07/2008, 00h06
  2. Réponses: 2
    Dernier message: 27/05/2008, 11h20
  3. Réponses: 12
    Dernier message: 30/11/2006, 19h42
  4. Attendre la fin des threads fils d'un processus
    Par SteelBox dans le forum Windows
    Réponses: 15
    Dernier message: 24/02/2006, 16h08
  5. Réponses: 2
    Dernier message: 04/10/2002, 09h13

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