Bien le bon jour/soir.
Le contexte est de synchronisation de "registry" docker/Quays mais peu importe.
Mon interrogation "bashique" est la suivante; on a plusieurs listes:
registrys='r1 r2'
orgas='a b c d e f g'
repos='a b c d e f'
Pour lancer mes synchronisation j'utilise un script bash qui est plus ou moins une imbrication de boucles for
:
for registry in $registrys: do
for orga in $orgas: do
for repo in $repo: do
sync source/$orga/$repo $registry/$orga/$repo
done
done
done
Ca fonctionne, c'est déjà ca … mais c'est extrêmement lent.
Je pourrais lancer les tâches en arrière plant
sync source/$orga/$repo $registry/$orga/$repo &
Mais ça va me lancer un nombre de processus assez important.
Ce que je veux c'est en gros que la synchro des deux registry cible ce fasse en même temps. Donc dans ce cas qu'on est que deux processus de synchro fils, l'un pour r1 et l'autre pour r2.
Quelqu'un aurait une piste/solutions SVP ?
# Sans garantie du gouvernement
Posté par gUI (Mastodon) . Évalué à 5. Dernière modification le 17 avril 2024 à 19:43.
si vraiment t'as que 2 registry je simplifierais avec un seul en
bg
(et lewait
qui va bien) et l'autre en "normal" :J'ai pas testé…
EDIT : un indice pour faire un truc plus générique : https://stackoverflow.com/questions/356100/how-to-wait-in-bash-for-several-subprocesses-to-finish-and-return-exit-code-0
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Sans garantie du gouvernement
Posté par Cyrille Pontvieux (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 18 avril 2024 à 10:49.
Exactement la réponse que j’aurais faites. Pareil pas testé mais ça me semble bon.
N.B. Ton titre parle de bash, mais tes « listes » n’en sont pas. Une liste en bash c’est
Quand tu n’as pas d’espace dans tes éléments de liste, tu peux faire comme tu fais. Sinon faut utiliser une vraie liste bash ou changer le séparateur (
IFS
) pour le caractère null et séparer tes éléments par null.[^] # Re: Sans garantie du gouvernement
Posté par Skilgannon . Évalué à 2.
J'ai testé effectivement ça fonctionne.
Merci
# xargs
Posté par NYC . Évalué à 1. Dernière modification le 17 avril 2024 à 20:43.
Il faut utiliser
xargs
.Ça donnera un truc du genre (à tester, j’écris à l’arrache mais en mode robuste)
Si tu veux écrire quand même sur le terminal dans la boucle faut écrire dans stderr (redirection
>&2
), ou jouer avec les fifo (commandemkfifo
).PS :
xargs
dispose de l’option-p
pour éviter de faire des bêtises.[^] # Re: xargs
Posté par Skilgannon . Évalué à 1.
J'ai pas réussi à la faire fonctionner tel que je le veux mais merci.
# GNU Parallel
Posté par harlock974 . Évalué à 3.
Tu pourrais essayer GNU parallel.
Je ne sais pas comment ça se paramètre dans ton cas mais un exemple en traitement d'image avec la commande mogrify d'imagemagick :
mogrify -resize 50% *.jpg
Cette commande va réduire à 50% la dimension des images jpg du répertoire courant, en les traitant l'une après l'autre.
ls *.jpg | parallel mogrify -resize 50%
Cette commande va lancer mogrify sur plusieurs processus en parallèle. L'exécution (sur mon ordinateur) sera trois fois plus rapide.
[^] # Re: GNU Parallel
Posté par NeoX . Évalué à 4.
avec un peu de chance parallel aura une option pour dire d'en faire 2 par 2 , histoire de ne pas exploser le CPU
[^] # Re: GNU Parallel
Posté par Marc Quinton . Évalué à 3.
exact ; il y a 2 options :
-j maxjobs
-l maxload
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.