Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/03/2022, à 16:25

dimivib

wait dès le 1er processus

Bonjour à tous,

j'ai un script qui lance plusieurs traitements SH en parallèle via des processus fils. Actuellement les sous processus se lancent par bloc de 5 et dès que les 5 sont terminés (avec un wait) les 5 suivants sont lancés, ainsi de suite.

Je souhaite optimiser ce mécanisme sans attendre que mes blocs de 5 se terminent. En gros dès qu'un processus fils se termine, j'en relance 1 directement dans la limite de 5 max en parallèle.
Est ce qu'il y a un moyen de faire ca ? peut être avec une autre commande que wait ?

Je suis en bash 4.2 sur le serveur.

Merci pour votre aide.

Hors ligne

#2 Le 23/03/2022, à 16:32

kamaris

Re : wait dès le 1er processus

xargs permet de faire ça, quitte à détourner un peu son usage, en jouant avec l'option -P.

Hors ligne

#3 Le 24/03/2022, à 18:17

dimivib

Re : wait dès le 1er processus

Merci, j ai pu tester un peu xargs et j'arrive à lancer mes scripts avec ?
Maintenant que le lancement fonctionne, est ce qu il est possible d arrêter si un processus fils plante ou retourne un code erreur ?
Est ce qu on peut récupérer un code retour avant de lancer le suivant ?

Merci pour ton aide

Hors ligne

#4 Le 24/03/2022, à 20:58

kamaris

Re : wait dès le 1er processus

Pas nativement je pense, ça va être du bricolage.
Par exemple, au lieu de

xargs command

tu peux faire

xargs sh -c 'command "$@" || exit 255' _

Ça forcera xargs à stopper si command échoue (le underscore à la fin est intentionnel).

Sinon il y a GNU Parallel qui doit pouvoir faire plus de choses, je ne crois pas l'avoir déjà utilisé : https://www.gnu.org/software/parallel/

Dernière modification par kamaris (Le 24/03/2022, à 21:07)

Hors ligne

#5 Le 25/03/2022, à 07:27

iznobe

Re : wait dès le 1er processus

Bonjour , et sinon en passant par une boucle et en limitant l' incrementation par exemple a un ecart de 5 maxi ca n' est pas possible ?
lorsqu ' un script se termine la difference repassant alors a 4 , la boucle relance un script fils .

les process tournent indefiniment ?
une boucle infinie : par exemple , en pseudo code

compteur =0;
while :
    lancement script
    si script non terminé : compteur +1
    script terminé : compteur -1
    if compteur = 5 : wait

Dernière modification par iznobe (Le 25/03/2022, à 07:30)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#6 Le 25/03/2022, à 08:24

dimivib

Re : wait dès le 1er processus

Bonjour Iznobe,

c'est exactement ce que je fais actuellement. Mon problème est que le wait attend sur les 5 processus se terminent. Si dans les 5 j'ai un traitement qui dure 1h, ma boucle va attendre 1h avant de lancer 5 traitements supplémentaires.

Hors ligne

#7 Le 25/03/2022, à 08:38

iznobe

Re : wait dès le 1er processus

as tu implementé la variable compteur ? si oui je dirais alors que c' est un probleme de codage , il faudrait que tu montres le code que tu utilises quitte a le simplifier et a enlver les trucs a données sensible .


un autre approche peut etre :

compteur=0;

if compteur < 5 :
   lancement script;
   compteur +1;

script terminé : compteur -1;

Mais sans un bout de code de depart , pas facile de voir ce qui cloche .

il faudrait la boucle , les varibales traités dans la boucle la recuperation des compteurs terminés et en route .

Generalement je fais ce genre de chose , en plantant des echos sur chaque modification variable dans un fichier journal pour verifier le deroulement du script et voir a quel moment , j ' ai une variable avec valeur erronée .

Dernière modification par iznobe (Le 25/03/2022, à 08:40)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#8 Le 25/03/2022, à 08:39

dimivib

Re : wait dès le 1er processus

Merci kamaris pour ta solution.

Il faut que je test un peu tous les cas mais ça à l'air de fonctionner. A quoi sert le _ à la fin de la ligne ? si je l'enlève ça ne marche pas donc il a une utilité que je ne capte pas smile

Ca marche aussi si je mets sh{} à la place du _

Dernière modification par dimivib (Le 25/03/2022, à 08:41)

Hors ligne

#9 Le 25/03/2022, à 14:04

dimivib

Re : wait dès le 1er processus

Pour ceux que ca intéresse, voici le code final simplifié :

cat $monFichierDeParametre | xargs --max-lines=1 -P 2 sh -c 'monScript.sh "$1" || exit 255' _ 2>/dev/null
[[ $? -ne 0 ]] && fctExit "ERREUR - Traitement interrompu"

$monFichierDeParametre est un fichier ligne à ligne avec l'ensemble de mes paramètres concaténés par un séparateur. Cette ligne de paramètres est découpée dans mon script.
Ma fctExit sort en erreur et stop le programme dès la 1ere erreur.

Hors ligne

#10 Le 26/03/2022, à 21:23

kamaris

Re : wait dès le 1er processus

dimivib a écrit :

A quoi sert le _ à la fin de la ligne ? si je l'enlève ça ne marche pas donc il a une utilité que je ne capte pas smile
Ca marche aussi si je mets sh{} à la place du _

Quand un shell est invoqué avec l'option -c, le premier paramètre passé au mini-script est assigné à $0, c'est-à-dire que c'est interprété comme le nom du mini-script.
Donc effectivement ça marche aussi avec tout autre caractère ou chaine, mais il y a une sorte de coutume à mettre _ smile

Sinon tu peux écrire ça en une ligne en évitant un appel inutile de cat et l'utilisation de $? :

xargs -a "$monFichierDeParametre" --max-lines=1 -P 2 sh -c 'monScript.sh "$1" || exit 255' _ 2>/dev/null || fctExit "ERREUR - Traitement interrompu"

Ou bien si c'est plus clair

if ! xargs -a "$monFichierDeParametre" --max-lines=1 -P 2 sh -c 'monScript.sh "$1" || exit 255' _ 2>/dev/null
then
  fctExit "ERREUR - Traitement interrompu"
fi

Hors ligne