GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Eine Bash-For-Schleife parallelisieren?

Ich habe versucht, das folgende Skript, insbesondere jede der drei FOR-Schleifeninstanzen, mit GNU Parallel zu parallelisieren, konnte dies jedoch nicht. Die 4 in der FOR-Schleife enthaltenen Befehle werden nacheinander ausgeführt, wobei jede Schleife etwa 10 Minuten dauert.

#!/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

Akzeptierte Antwort:

Warum forkst du sie nicht einfach (auch bekannt als Hintergrund)?

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

Falls das nicht klar ist, der wesentliche Teil ist hier:

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

Bewirkt, dass die Funktion in einer gegabelten Shell im Hintergrund ausgeführt wird. Das ist parallel.


Linux
  1. Wie schreibe ich eine Schleife in Bash?

  2. Bash For Loop Guide und Beispiele

  3. Beispiele für Bash-For- und While-Schleifen

  4. 12 Bash-For-Loop-Beispiele für Ihr Linux-Shell-Scripting

  5. Verschachtelte for-Schleife

Bash For Loop mit praktischen Beispielen

Bash-Scripting – For-Schleife mit Beispielen erklärt

Bash For-Schleifen mit Beispielen

Bash For Loop – Die praktischste Anleitung

Die Bash FOR-Schleife erklärt und vereinfacht

Bash-Skript für Schleife mit Beispielen erklärt