[bash] wait pour n'attendre qu'un seul fils

wait pour n'attendre qu'un seul fils [bash] - Shell/Batch - Programmation

Marsh Posté le 30-03-2010 à 22:05:54    

Bonjour,
 
Tout n'est pas dans le titre.
Dans le shell, la fonction wait permet soit d'attendre tous les fils, soit un fils ciblé par son PID si je ne m'abuse.
J'aimerais coder le comportement suivant.  
 
J'ai plein de runs différents à faire, mais je voudrais n'en avoir que N différents en même temps.
 

Code :
  1. CPT=0
  2. for filename in *
  3. do
  4.   monExe filename&
  5.   CPT=$((CPT + 1))
  6.   if [ CPT -eq 3 ]
  7.   then
  8.     # j'attends que l'un des runs soit fini pour en relancer un autre
  9.   fi
  10. done


 
Mon problème est que mettre un wait me ferai attendre les 3, je n'optimise donc pas mon utilisation des ressources.
 
Merci d'avance pour vos réponses ;-)

Reply

Marsh Posté le 30-03-2010 à 22:05:54   

Reply

Marsh Posté le 30-03-2010 à 23:51:24    

Tu peux toujours tracer le nombre de "monExe" en cours d'exécution avec ps, dans une boucle while qui ne sort que si ce nombre de processus est < au nombre max de processus voulus.
 
Sinon, d'habitude je passe pour faire ce genre de chose par un p'tit script perl écrit à l'arrache, qui fork en créant un fichier flag (avec le PID dans le nom du fichier) et le détruit en sortant, et le processus père qui lance un nouveau fils dès que le nombre de fichier flag est < au nombre de processus parallèle désiré.

Reply

Marsh Posté le 31-03-2010 à 00:19:11    

J'aime bien l'astuce, mais par contre je vois pas pourquoi il y a besoin de passer par un script perl pour créer les fichiers flags.
 
En fait, au départ je me demandais si on pouvait pas tripatouiller wait du shell pour avoir un comportement proche du wait() en C.
 
Mici ;-)

Reply

Marsh Posté le 31-03-2010 à 10:23:49    

Lan Wezel a écrit :

J'aime bien l'astuce, mais par contre je vois pas pourquoi il y a besoin de passer par un script perl pour créer les fichiers flags.

 

Euh non je n'ai pas dit ça, je dis juste que c'est ce que moi je fais. Parce que je trouve ça plus pratique, rien de plus.

 
Lan Wezel a écrit :

En fait, au départ je me demandais si on pouvait pas tripatouiller wait du shell pour avoir un comportement proche du wait() en C.

 

Ben le seul moyen d'émuler ce comportement, c'est justement une boucle qui scanne le nombre de processus actifs. Je ne connais pas de moyen de faire la même chose avec la commande wait du shell.


Message édité par Elmoricq le 31-03-2010 à 10:24:10
Reply

Marsh Posté le 13-04-2010 à 13:10:44    

Sinon truc de Sioux :  
 
1/ Stocker la liste des noms des binaires dans un tableau pour pouvoir utiliser un pointeur plus facilement (une variable "position" exportée au début du script principal)
 
2/ Utiliser un mini-shell lancé en boucle en tâche de fond dans ton script principal pour appeler tes binaires, ce mini-shell encapsule la création / destruction du fameux flag dont parle Elmoricq, avec pour le coup un wait  du binaire qu'il lance.
 
3/ Dans ton shell chapeau, tu utilises une boucle avec un sleep qui sort quand plus de flag présent. Cette boucle vient vérifier régulièrement le nombre de flag présents : si = 0 tu sors (condition de la boucle), s'il est inférieur à 3, alors tu incrémentes ta variable "position" et si la case du tableau existe (donc encore des scripts à lancer) tu utilises le mini-shell pour lancer un nouveau binaire.
 
Bon ok , fais à l'arrache comme ça je sais pas si je suis très clair  :bounce:  :pt1cable:  :heink:  :cry:  ? Sinon hésite pas, j'essayerai de développer un peu plus clairement (là j'ai la flemme de développer un petit exemple  :sarcastic:


---------------
En programmation, quand t'as un problème et qu'il n'y a que deux solutions valides, seule la troisième fonctionne !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed