19

次のようなことを行う 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はあります23?

4

7 に答える 7

13

これを適切な依存関係を持つ Makefile に変換します。次に、make -jMake に可能な限りすべてを並行して実行させるために使用できます。

Makefile 内のすべてのインデントはTAB でなければならないことに注意してください。TAB は、実行するコマンドがある Make を示します。

また、この 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 $< $@
于 2010-05-07T19:13:51.700 に答える
8

bash では、私はそうします。

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

それらを生成して並行して実行します。別の例については、この SO スレッドを確認できます。

于 2010-05-07T19:24:57.937 に答える
5
#!/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 よりも多くのファイルがあるとあなたが言ったことに気付いたからです。あなたが必要です。

于 2010-05-07T19:27:15.147 に答える
3

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

#!/bin/csh
エコースタート
スリープ 1 &
スリープ 1 &
スリープ 1 &
待つ
エコーOK

テスト:

$時間./csh.sh
始める
[1] 11535
[2] 11536
[3] 11537
【3】おやすみ1
[2] - スリープ完了 1
[1] + 睡眠完了 1
わかった

実質 0m1.008s
ユーザー 0m0.004s
システム 0m0.008s
于 2010-05-07T19:32:07.267 に答える
0

GNU Parallel を使用すると、次のようになります。

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

「ex」と「combine」がどのように機能するかに応じて、次のこともできます。

seq 1 3 | parallel ex file{} | combine

GNU Parallel の詳細については、http://www.youtube.com/watch?v= LlXDtd_pRaY をご覧ください。

于 2010-06-11T00:41:31.377 に答える
0

xargs出来る:

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

-n 1「入力ごとに1行」-P用であり、「各行を並行して実行する」ためです

于 2015-03-23T13:03:19.513 に答える
0

nohup exを使用できます:

nohup ex file1 r1 &    
nohup ex file2 r2 &
nohup ex file3 r3 &
于 2011-02-12T01:09:56.770 に答える