GNU/Linux >> Linux Esercitazione >  >> Linux

Parallelizzare un Bash For Loop?

Ho cercato di parallelizzare il seguente script, in particolare ciascuna delle tre istanze del ciclo FOR, usando GNU Parallel ma non sono stato in grado di farlo. I 4 comandi contenuti nel ciclo FOR vengono eseguiti in serie, ogni ciclo richiede circa 10 minuti.

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

Risposta accettata:

Perché non li biforchi (ovvero in background)?

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

Nel caso non fosse chiaro, la parte significativa è qui:

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

Causando l'esecuzione della funzione in una shell biforcuta in background. È parallelo.


Linux
  1. Come scrivere un ciclo in Bash

  2. Bash For Loop Guida ed esempi

  3. Scripting Linux:3 istruzioni per i cicli while in Bash

  4. 12 Esempi di Bash For Loop per gli script della tua shell Linux

  5. Bash di Linux. ciclo for e funzione, per sommare numeri

Bash For Loop con esempi pratici

Bash Scripting – For Loop spiegato con esempi

Bash For Loops con esempi

Bash For Loop – La guida più pratica

Il ciclo Bash FOR spiegato e semplificato

Script Bash per Loop spiegato con esempi