GNU/Linux >> Tutoriels Linux >  >> Linux

Paralléliser une boucle Bash For ?

J'ai essayé de paralléliser le script suivant, en particulier chacune des trois instances de boucle FOR, en utilisant GNU Parallel, mais je n'ai pas pu le faire. Les 4 commandes contenues dans la boucle FOR s'exécutent en série, chaque boucle prenant environ 10 minutes.

#!/bin/bash

kar='KAR5'
runList='run2 run3 run4'
mkdir normFunc
for run in $runList
do 
  fsl5.0-flirt -in $kar"deformed.nii.gz" -ref normtemp.nii.gz -omat $run".norm1.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12 
  fsl5.0-flirt -in $run".poststats.nii.gz" -ref $kar"deformed.nii.gz" -omat $run".norm2.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12 
  fsl5.0-convert_xfm -concat $run".norm1.mat" -omat $run".norm.mat" $run".norm2.mat"
  fsl5.0-flirt -in $run".poststats.nii.gz" -ref normtemp.nii.gz -out $PWD/normFunc/$run".norm.nii.gz" -applyxfm -init $run".norm.mat" -interp trilinear

  rm -f *.mat
done

Réponse acceptée :

Pourquoi ne les bifurquez-vous pas (c'est-à-dire l'arrière-plan) ?

foo () {
    local run=$1
    fsl5.0-flirt -in $kar"deformed.nii.gz" -ref normtemp.nii.gz -omat $run".norm1.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12 
    fsl5.0-flirt -in $run".poststats.nii.gz" -ref $kar"deformed.nii.gz" -omat $run".norm2.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12 
    fsl5.0-convert_xfm -concat $run".norm1.mat" -omat $run".norm.mat" $run".norm2.mat"
    fsl5.0-flirt -in $run".poststats.nii.gz" -ref normtemp.nii.gz -out $PWD/normFunc/$run".norm.nii.gz" -applyxfm -init $run".norm.mat" -interp trilinear
}

for run in $runList; do foo "$run" & done

Au cas où ce ne serait pas clair, la partie importante est ici :

for run in $runList; do foo "$run" & done
                                   ^

Provoquer l'exécution de la fonction dans un shell forké en arrière-plan. C'est parallèle.


Linux
  1. Comment écrire une boucle dans Bash

  2. Bash For Loop Guide et exemples

  3. Script Linux :3 tutoriels pour les boucles while dans Bash

  4. 12 exemples de boucle Bash For pour votre script de shell Linux

  5. bash Linux. pour boucle et fonction, pour additionner des nombres

Bash For Loop avec des exemples pratiques

Bash Scripting - Boucle For expliquée avec des exemples

Bash For Loops avec des exemples

Bash For Loop – Le guide le plus pratique

La boucle Bash FOR expliquée et simplifiée

Script bash pour la boucle expliqué avec des exemples