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

Linux Discussion :

Lancer un nombre limité de sous-shells en parrallèle


Sujet :

Linux

  1. #1
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut Lancer un nombre limité de sous-shells en parrallèle
    Bonjour,

    Voilà, j'ai un script qui lit l'entré standard et qui effectue un traitement sur chaque ligne. Mais comme lors de ce traitement il y a souvent un temps d'attente (ça dépend du réseau) j'ai envie de réaliser plusieurs traitement en même temps.

    Mon script est donc censé lancer 10 sous-shells et pas un de plus.
    Or, manifestement il en lance beaucoup plus.
    Voilà le 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/bin/sh
     
    while read P; do
            libre=-1
            # On recommence tant qu'il n'y a pas eut de place libre
            while [ $libre -eq -1 ]; do
                    # On fait le ménage
                    for ((i=0; $i<10; i=$(($i+1)))); do
                            if [[ ${tpid[$i]} -ne 0 && `ps -e | awk '{print $1}' | grep -c $tpid[$i]` -eq 0 ]]; then
                                    tpid[$i]=0;
                            fi
                    done
     
                    # On cherche une place libre et on défini laquelle c'est
                    for ((i=0; $i<10; i=$(($i+1)))); do
                            if [[ ${tpid[$i]} -eq 0 ]]; then
                                    libre=$i;
                                    break
                            fi
                    done
     
                    # si on en a pas trouvé de libre, on attend 0.5 secondes
                    if [ $libre -eq -1 ]; then
                            sleep 0.5
                    fi
            done
     
            (
                    # blabla je m'occupe de $P
            ) &
     
            tpid[$libre]=$!
    done
    Voilà, l'idée c'était de stoquer dans le tableau tpid la liste des pid des sous-shells en cours, de relancer le traitement si il y a une place de libre dans ce tableau, et de faire le ménage de temps en enlevant du tableau les pid des sous-shells qui se sont terminés.

    Mon idée de départ était beaucoup plus simple, il s'agissait d'avoir juste un compteur qui s'incrémente quand on lance un sous-shell, et qui se décrémente quand il se termine, puis relancer ou non un traitement en fonction du nombre de sous-shells en cours. Mais je n'ai pas trouvé le moyen de décrémenter la variable quand il faut. :/



    Donc si quelqu'un voit l'erreur dans mon code ou si il a une nouvelle idée je suis preneur.
    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Ah bah j'ai trouvé.

    Le problème se trouvait dans la vérification des process encore en vie, j'avais oublié les accolades pour désigner l'élément du tableau.

    D'ailleurs j'en profite pour demander si il n'y a pas un moyen plus simple pour vérifier si un processus est en vie que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ `ps -e | awk '{print $1}' | grep -c ${tpid[$i]}` -eq 0 ]]
    Parceque bon... ce test est réalisé 10 fois de suites, et ces 10 tests seront peut-être répétés plusieurs fois. Ça fini par être un peu lourd.

    Edit : Je donne mon code entier ça pourrait être utile (parceque je l'ai modifié depuis mon premier post).
    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
    #!/bin/sh
     
    while read P; do
    	libre=-1
    	# On recommence tant qu'il n'y a pas eut de place libre
    	while [ $libre -eq -1 ]; do
    		# On fait le ménage, et on cherche une place libre
    		for ((i=0; $i<10; i=$(($i+1)))); do
    			if [[ ${tpid[$i]} -ne 0 && `ps -e | awk '{print $1}' | grep -c ${tpid[$i]}` -eq 0 ]]; then
    				tpid[$i]=0;
    			fi
    			# Si on a une place libre et qu'on en avait pas déjà une, et bah on la note :)
    			[[ ${tpid[$i]} -eq 0 ]] && [[ $libre -eq -1 ]] && libre=$i
    		done
     
    		# Si on en a pas trouvé de libre, on attend 0.5 secondes
    		[[ $libre -eq -1 ]] && sleep 0.5
    	done
     
    	(
    		# Traitement de $P
    	fi) &
     
    	tpid[$libre]=$!
    done
    Et une dernière petite question :
    C'est quoi la différence entre if [ bla ] et if [[ bla ]] ?

Discussions similaires

  1. [Batch] Lancer un nombre fixe de processus en parallèle sous DOS
    Par bernidupont dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 04/12/2014, 17h31
  2. comment lancer la commande java sans bloquer le shell sous MacOsX
    Par philippe6 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/04/2014, 19h20
  3. compter le nombre de mot dans une ligne fichier sous shell
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 18/12/2008, 18h54
  4. Question sous shell
    Par Geache dans le forum Linux
    Réponses: 3
    Dernier message: 16/12/2004, 20h32
  5. lancer le setup d'oracle 9i sous XP avec un pentium 4
    Par caro.g dans le forum Administration
    Réponses: 1
    Dernier message: 12/10/2004, 15h54

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