J'ai le script bash suivant, qui démarre un programme plusieurs fois en parallèle et passe une variable de contrôle à chaque exécution. Le programme utilise plusieurs ressources, donc après avoir été démarré 10 fois en parallèle, je veux attendre jusqu'à ce que les 10 derniers démarrés soient terminés.Attente des 10 derniers travaux démarrés en parallèle pour terminer dans bash
Je le fais actuellement très grossièrement, en attendant 10 cycles d'attente le plus longtemps possible pour que 10 programmes démarrés en parallèle soient terminés.
Existe-t-il un moyen simple d'implémenter ce comportement?
steps=$((500/20))
echo $steps
START=0
for((i=START;i < steps; i++))
do
for((j=START;j < steps;j++))
do
for((k=START;k < steps;k++))
do
n=$(($j*steps +$k))
idx=$(($i*$steps*$steps + $n))
if ! ((idx % 10)); then
echo "waiting for the last 10 programs"
sleep 10
else
./someprogram $idx &
fi
done
done
done
Si vous souhaitez suivre si les programmes réussi ou échoué, vous voudrez stocker leurs PID. Un mappage de tableau associatif entre PID et 'idx' est particulièrement utile, car cela vous permet de savoir quels' idx's ont réussi et échoué. –
BTW, cette approche dans son ensemble est généralement assez inefficace - vous avez généralement un tas de temps processeur gaspillé entre le moment où le premier programme dans un lot se termine et quand le dernier fait. Mieux vaut utiliser quelque chose comme 'pour ((k = début; k
@CharlesDuffy Merci, j'ai vu cet article et je ne suis pas tout à fait sûr qu'il est relatable pour mon cas en raison de l'utilisation d'un appareil asynchrone, qui repose sur le temps d'attente pour terminer les travaux. Cependant, votre réponse fournit-elle déjà l'attente du programme ou est-ce juste pour commencer? – Kev1n91