Forum Programmation.shell [BASH] tâches en arrière plant

Posté par  . Licence CC By‑SA.
Étiquettes :
2
17
avr.
2024

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  (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 le wait qui va bien) et l'autre en "normal" :

    for orga in $orgas: do
      for repo in $repo: do
        sync source/$orga/$repo r1/$orga/$repo &
        pid1=$!
        sync source/$orga/$repo r2/$orga/$repo
        wait $pid1
      done
    done

    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  (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

      declare -a orgas=(a b c d e f g)
      for orga in "${orgas[@]}": do
        ...
      done

      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  . Évalué à 2.

      J'ai testé effectivement ça fonctionne.

      Merci

  • # xargs

    Posté par  . É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)

    for ...
        for ...
            printf '%s\0%s\0' "$arg1" "$arg2"
        done
    done \
    | xargs -r -n2 -d'\0' -P2 sync

    Si tu veux écrire quand même sur le terminal dans la boucle faut écrire dans stderr (redirection >&2), ou jouer avec les fifo (commande mkfifo).

    PS : xargs dispose de l’option -p pour éviter de faire des bêtises.

    • [^] # Re: xargs

      Posté par  . Évalué à 1.

      J'ai pas réussi à la faire fonctionner tel que je le veux mais merci.

  • # GNU Parallel

    Posté par  . É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  . É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

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.