web-dev-qa-db-ja.com

シェルスクリプトで並列実行を使用するにはどうすればよいですか?

私は次のようなことをするCシェルスクリプトを持っています:

#!/bin/csh
gcc example.c -o ex
gcc combine.c -o combine
ex file1 r1     <-- 1
ex file2 r2     <-- 2
ex file3 r3     <-- 3
#... many more like the above
combine r1 r2 r3 final
\rm r1 r2 r3

線を引く方法はありますか12および3次々にではなくparallelで実行しますか?

19
Lazer

これを適切な依存関係を持つMakefileに変換します。次に、make -jを使用して、Makeにすべてを並行して実行させることができます。

Makefileのすべてのインデント必須はTABであることに注意してください。 TABは、実行するコマンドの場所を作成することを示しています。

また、このMakefileは現在GNU Make拡張機能(ワイルドカードおよびsubst関数)を使用していることに注意してください。

次のようになります。

export PATH := .:${PATH}

FILES=$(wildcard file*)
RFILES=$(subst file,r,${FILES})

final: combine ${RFILES}
    combine ${RFILES} final
    rm ${RFILES}

ex: example.c

combine: combine.c

r%: file% ex
    ex $< $@
13
Zan Lynx

バッシュで私はします。

ex file1 r1  &
ex file2 r2  &
ex file3 r3  &
wait
... continue with script...

それらをスポーンして並行して実行します。別の例として、 これをチェックしてくださいSOスレッド

8
AlG
#!/bin/bash

gcc example.c -o ex
gcc combine.c -o combine

# Call 'ex' 3 times in "parallel"
for i in {1..3}; do
  ex file${i} r${i} &
done

#Wait for all background processes to finish
wait

# Combine & remove
combine r1 r2 r3 final
rm r1 r2 r3

ブレース展開を使用するようにコードを少し変更しました{1..3} 3だけではなく、ファイルの数が多いとおっしゃっていたので、数値をハードコーディングするのではなく、中括弧内の「3」を必要な数に置き換えることで、中括弧の拡張により、より大きな数値へのスケーリングが簡単になります。

5
SiegeX

cmd&を使用して、後で待つことができます

#!/ bin/csh 
 echostart 
 sleep 1&
 sleep 1&
 sleep 1&
 wait 
 echo ok 

テスト:

 $ time./csh.sh
start
[1] 11535 
 [2] 11536 
 [3] 11537 
 [3]完了スリープ1 
 [2]-完了スリープ1 
 [1] +完了スリープ1 
 ok 
 
実際の0m1.008s 
 user 0m0.004s 
 sys 0m0.008s 
3
Oleg Razgulyaev

Nohup ex:を使用できます

Nohup ex file1 r1 &    
Nohup ex file2 r2 &
Nohup ex file3 r3 &
0
ant

xargsはそれを行うことができます:

seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%

-n 1は「入力ごとに1行」の場合、-Pは「各行を並列に実行する」ためのものです

0
avim

GNU Parallelは、次のようになります。

seq 1 3 | parallel ex file{} r{}

'ex'と 'combine'の動作に応じて、次のこともできます。

seq 1 3 | parallel ex file{} | combine

GNU並列を見て http://www.youtube.com/watch?v=LlXDtd_pRaY

0
Ole Tange