|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Bonjour
J'aimerai pouvoir lancer disons 15 process en parallèle en permanence. C'est à dire que j'ai une file d'attente et que dès qu'un fini, je lance le suivant. Est-ce possible ?
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 743 ![]() |
ben il suffit de mettre un '&' à la fin de chaque lancement...
Exemple : start_proc.sh Code :
Si tu veux du série (ce que tu décris à la fin (ta phrase est contradictoire)), il suffit d'enlever les &... A ce compte-là le script lance le premier, et est suspendu jusqu'à ce que le premier processus s'arrête..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
||
|
|
00
|
|
|
#3 | ||||
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 546 ![]() |
si je comprend bien tu veux lancer des chaines de jobs en parallele mais chacune en parallele ?
A-B-C-D L-M-N-O X-Y-Z tu peux faire tout simplement comme ça chaque chaines tourne en parallele mais chaque job à l'interrieur de chaque chaine attend la fin du precedent... et bien sur on peut faire des condition par exemple pour que Y demarre que si C est fini etc....etc...etc... (A ; B ; C ; D) & (L ; M ; N ; O) & (X ; Y ; Z ) & par exemple : Code :
Code :
|
||||
|
|
00
|
|
|
#4 |
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Bonjour
Je comprends ce que vous me montrez. Mais il me semble que ce n'est pas ce que je demande ! J'ai des process en attente : a, b, c, d, e, f... Je ne veux en avoir que trois qui tourne en même temps. Je lance a, b et c. Dès qu'un des trois s'arrête je veux lancer e, dès qu'un nouveau s'arrête, je lance f.... La méthode de frp31 bien que meilleur qu'un méthode série peut ne pas accélérer beaucoup le processus si tous les process qui sont lents sont dans la ligne 1.
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 546 ![]() |
ah ok donc oui la methode cité au dessus ne va pas dans ce cas en effet.
le mieux est de lancer a,b,c comme précédament. mais de controler la nombre de processus actifs (parmis ceux de la liste). Code :
C'est un peu lourd comme syntaxe mais ça doit marcher suffira de remplacer a,b,c,d, etc... par des fonctions dans le haut du script... mais le principe est là : en fait il y a que 3 trucs à changer à chaque fois to_do (reste à faire) actif (en cours) p1 à p3 (pour les processus correspondants...) donc ainsi la liste to_do="abcdefgh" devient si a est fini to_do="defgh" et les actif=dbc puis liste to_do="bdefgh" (par exemple si c fini avant b) devient si a est fini to_do="fgh" et les actif=dbe puis si c'est alors d qui fini le premier liste to_do="bdefgh" (par exemple si c fini avant b) devient si a est fini to_do="gh" et les actif=bef et ainsi de suite... le dernier job detruira le fichier lock pour que le script qui controle les lancement ne finisse qu'apres ce dernier job. en utilisant des tables de variables y'a moyen d'obtimiser ça je pense... là c'est brouillon "de concept"... |
||
|
|
00
|
|
|
#6 |
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
J'avoue que je suis un peu planté devant un tel programme !
J'essaie de comprendre, mais c'est l'heure de me coucher... Première question : Pourquoi tu ne fais pas le grep -v grep dès p1, p2 et p3 ? Cette liste doit identifier le processus a (il faut donc un nom plus compliqué !) Et Ce ps -ef ? pas ps ux ? Dernière question pour ce soir J'ai l'impression qu'une chose est copié trois fois ! La première fois ça doit être pour a, la seconde pour b, la troisième incomplète sur c. Pourquoi cette 3ème fois est incomplète ? Et j'avoue ne pas maîtriser assez le bash pour comprendre tout ça !
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|
|
00
|
|
|
#7 | ||||
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 546 ![]() |
là c'est pas un code fonctionnel mais juste les grande lignes il faut broder autour après...
c'est juste "concept"... il y a donc juste des "bouts de code" et pas un programme complet... bien sur on peut simplifier le code mais il va être très très long dans ce cas...Si j'ai le temps je ferai un exemple dans la journée/soirée. ps -ef ou ps -aux dans ce cas remonte la même info. puisqu'on coupe l'affichage ==================================================== voilà un exemple qui marche : Code :
Code :
puis cde puis fgh puis ijk pour l'exploiter il suffit de changer sleep 10 par la commande que tu veux lancer (ça peut etre un script ou un programme) ![]() en fait en utiliser un mot dans un fichier dans /tmp pour voir si une tache est finie ou pas ça simplifie vachement les choses.... |
||||
|
|
00
|
|
|
#8 | |||
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Citation:
Je pense voir le process en faisant ps -ef | grep "programmesanspareil.sh" | grep -v grep. Le problème, c'est que je vois rien Un ps uwx ne me montre que la commande bash que le script exécute C'est à dire que si je mets sleep 100 comme seule commande de programmesanspareil.sh, seul sleep 100 apparaitra dans un ps uwx. Si je réfléchis bien à tout ce que tu m'as écrit, je peux faire écrire un lock à chacun de mes process et vérifier sa présence pour en lancer un nouveau. Voici un algo : Code :
Correct non ? Désolé pour le retard, mais mon serveur est(était ?) très malade et l'accès à internet ne marche plus beaucoup !
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|||
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 546 ![]() |
laisses tomber la methode lock et les ps
comme tu vois dans l'exemple revu et corriger le plus simple et de cree un fichier pour chaque "commande" terminée et donc de simplement tester si les fichiers sont presents ou pas pour savoir si elle est terminée. tu n'as pas d'autre modifs à faire que remplacer le sleep 10 aucune .... |
|
|
00
|
|
|
#10 |
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Le problème, c'est que je veux toujours lancer la même commande, mais avec un paramètre différent chaque fois !
Et je ne sais pas combien de fois j'aurais à la lancer en tout. Ça dépend de la longueur du fichier ! Le nombre de processus maximum à faire tourner en parallèle est en dur dans ton programme. Je préfère le laisser libre en fonction de la puissance de la machine. J'ai moi aussi viré les ps. Mes lock, c'est comme tes fichiers ! La seule chose que je regarde, c'est s'ils sont présents ou non. Pas s'il est écrit quelque chose dedans !
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 546 ![]() |
ok donc la oui il faudra broder autour de la methode oui
|
|
|
00
|
|
|
#12 | ||
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Code :
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
||
|
|
00
|
|
|
#13 |
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Je me demande si ma boucle ne bouffe pas tout le temps CPU ! Des sleep seraient peut-être les bien venu !
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
|
|
00
|
|
|
#14 | |||||
|
Membre éprouvé
![]() Inscription : mai 2002 Messages : 535 ![]() |
Juste une remarque troumad :
Il me semble , qu'il y ait un effet de bord tous les process sont teminés , je pense qu'il serait judicieux de rajouter Voici un exemple qui s'appuie sur une liste de commandes contenues dans le fichier "Les_CMD" Code :
![]() Code :
Citation:
__________________
Signé : Capitaine Jean-Luc Picard |
|||||
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 546 ![]() |
ok
|
|
|
00
|
|
|
#16 | ||
![]() ![]() Bernard SIAUDEnseignant Inscription : novembre 2003 Messages : 4 400 ![]() |
Merci pour la remarque !
J'avais déjà résolu le problème... La résolution étant un effet de bord d'un autre problème En effet, je ne vais donner une ligne qu'à un seul process. Quand j'ai donné une ligne à un process, alors je sors de la boucle en instaurant i à MAX (=> sortie de la boucle) juste avant l'incrémentation de i. Ceci le mettra à MAX+1 en sortie de boucle. Donc, si je sors de la boucle sur MAX (il me semble en décrivant l'astuce que drap=0 aurait suffit !) c'est que tous les process travaillent et que donc, je peux attendre => sleep 10. Code :
__________________
Modérateur Mandriva Linux Amicalement VOOotre Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org Mes tutoriels |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com