Pages : 1
#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
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
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
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 _
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