私は次のようなことをする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
線を引く方法はありますか1
、2
および3
次々にではなくparallelで実行しますか?
これを適切な依存関係を持つ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 $< $@
バッシュで私はします。
ex file1 r1 &
ex file2 r2 &
ex file3 r3 &
wait
... continue with script...
それらをスポーンして並行して実行します。別の例として、 これをチェックしてくださいSOスレッド 。
#!/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」を必要な数に置き換えることで、中括弧の拡張により、より大きな数値へのスケーリングが簡単になります。
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
Nohup ex:を使用できます
Nohup ex file1 r1 &
Nohup ex file2 r2 &
Nohup ex file3 r3 &
xargs
はそれを行うことができます:
seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%
-n 1
は「入力ごとに1行」の場合、-P
は「各行を並列に実行する」ためのものです
GNU Parallelは、次のようになります。
seq 1 3 | parallel ex file{} r{}
'ex'と 'combine'の動作に応じて、次のこともできます。
seq 1 3 | parallel ex file{} | combine