GNU/Linux >> Linux の 問題 >  >> Linux

Bash Forループを並列化しますか?

次のスクリプト、特に3つのFORループインスタンスのそれぞれをGNU Parallelを使用して並列化しようとしましたが、並列化できませんでした。 FORループに含まれる4つのコマンドは連続して実行され、各ループには約10分かかります。

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

承認された回答:

フォーク(バックグラウンド)してみませんか?

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

それが明確でない場合、重要な部分はここにあります:

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

関数がバックグラウンドでフォークされたシェルで実行されるようにします。それは平行しています。


Linux
  1. Bashでループを作成する方法

  2. BashForループガイドと例

  3. Bash の For ループと While ループの例

  1. ループの維持 – Bash For、While、Until ループの例

  2. Linux シェル スクリプト用の 12 の Bash for ループの例

  3. ネストされた for ループ

  1. Linuxスクリプト:Bashでのwhileループの3つのハウツー

  2. Bash for ループの例

  3. Linux バッシュ。 for ループと関数、数値の加算