Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell

Shell Vos questions sur l'utilisation des commandes shell

Réponse
 
Outils de la discussion
Vieux 19/08/2008, 16h12   #1 (permalink)
Membre du Club
 
Date d'inscription: décembre 2002
Messages: 81
Par défaut Mettre fin à un shell lancé à partir d'un script (gestion des process id)

Bonjour,

voici la partie de mon script qui pose problème:

Code :
function buildProject () {
		build PARAM0 &
		PID1=$!
                build PARAM1 &
                PID2=$!
		wait ${PID1}
                wait ${PID2}
		build PARAM2
		return 0
	}

function build {
	sh -s 
		#
                # Mes traitements...
                #
        exit 0;
}

buildProject;
Comme vous le voyez, il faut que mes taches build PARAM1 et build PARAM0 soient terminées (et exécutées en parallèle) afin que je puisse appeler ma tache build PARAM2.

Le problème, c'est que lorsque mon premier traitement est terminé, mon wait ne se déclenche pas. Le script retourne en console et il faut que je tape explicitement un exit pour que mon wait se déclenche.

Avez-vous une idée pour résoudre mon problème?
J'ai essayé un return à la place du exit, même résultat et même un kill $$ à la fin de mes traitement dans ma deuxième méthode, mais tous les process sont tués.

Merci d'avance

Dernière modification par sanchou ; 19/08/2008 à 16h13 Motif: Pas assez explicite
sanchou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/08/2008, 15h13   #2 (permalink)
Membre du Club
 
Date d'inscription: décembre 2002
Messages: 81
Par défaut

Bonjour à tous,

j'ai trouvé une solution partielle à mon problème :

Code :
function buildProject () {
		build PARAM0 &
		build PARAM1 &
                build PARAM2 &
                wait 
		build PARAM3
		return 0
	}

function build {
		#
                # Mes traitements...
                #
        exit 0;
}

buildProject;
L'appel à wait sans paramètre permet d'attendre que tous les process fils soient terminés.

Pour optimiser tout çà, je vous donne un exemple de cas que je ne gère pas avec ce script.

Si mon but est de construire PARAM3 et que:

- PARAM3 a besoin que PARAM0 et PARAM2 soient construits
- PARAM2 a besoin que PARAM1 soit construit

En définitive, comment faire pour que PARAM0 soit construit en parallèle de PARAM1 et PARAM2 qui eux doivent être construits séquentiellement?

Si vous avez besoin de détails supplémentaires, n'hésitez pas à demander.

Merci d'avance

Nico
sanchou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 10h26   #3 (permalink)
Membre régulier
 
Date d'inscription: mars 2007
Messages: 114
Par défaut

Ne peux tu pas écrire un truc du genre :

build P1 && build P2 && build P0 && build P3

Si ta fonction retourne les une valeur adéquat en cas d'erreur
et de succès ça devrait fonctionner.
ericduval est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 12h37   #4 (permalink)
Membre du Club
 
Date d'inscription: décembre 2002
Messages: 81
Par défaut

Bonjour,

Le problème avec le &&, c'est que les instructions s'exécutent séquentiellement...
Or j'ai besoin de paralleliser les traitements...

Merci de ta réponse en tout cas.

Other idea?
sanchou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 15h00   #5 (permalink)
Membre régulier
 
Date d'inscription: mars 2007
Messages: 114
Par défaut

J'ai pas essayé et honte sur moi
j'ai même pas vérifié que cela soit possible :

(P0& ; P1 && P2) && P3
ericduval est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/08/2008, 21h38   #6 (permalink)
Membre Confirmé
 
Date d'inscription: septembre 2007
Localisation: Genève
Âge: 45
Messages: 219
Par défaut

Bonjour,

J'ai fait un petit programme shell pour déduire automatiquement les dépendances... à partir du moment où elles sont bien décrites dans l'appel, bien sûr. Le voici:
Code :
#!/bin/bash

function buildProject
{
    argList="$(echo $* | tr ' ' '\n')"
    newArgList="$argList"
    buildingDone="false"
    while [ $buildingDone = "false" ]
    do
        if [ -n "$argList" ]
        then
            for arg in $argList
            do
                if [ $(echo $arg | awk -F ',' '{print NF}') = "1" ]
                then
                    bash -c "echo 'building '$arg'...'; sleep 5" &
                    newArgList="$(echo "$newArgList" | sed -e 's/,*'$arg'//')"
                fi
            done
            wait
            argList="$newArgList"
        else
            buildingDone="true"
        fi
    done
}

buildProject arg0 arg1 arg2,arg1 arg3,arg0,arg2
Plusieurs remarques:
1) La ligne rouge doit être adaptée, je ne sais pas ce que le build fait.
2) La ligne verte donne les dépendances. Ici cela donne: arg0 ne dépend de rien, arg1 non plus, arg2 dépend de arg1 et arg3 dépend de arg0 et arg2. Attention, il n'y a pas d'espace autour des virgules!
3) Je n'ai pas trop testé, c'est juste une base. Notamment, si la description des dépendances est circulaire, le programme risque de boucler!
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide