1

多数のファイルに対して実行したいスクリプトがあります

my_script file_name

しかし、私はたくさん持っているので、最初に処理したいファイルの5つの「等しい」リストを作成し、次にこれを行うことで、同時に複数を処理するためのコードをいくつか書きました

my_function() {
    while read i; do 
        my_script $i
    done < $1
}

my_function list_1 &
my_function list_2 &
my_function list_3 &
my_function list_4 &
my_function list_5 &

wait

これは、各リストの最初のファイルに対して機能しますが、その後終了します。関数を単純なエコーに変更すると、正常に動作します

my_function() {
    while read i; do 
        echo $i
    done < $1 
}

期待どおり、各リストのすべてのファイルを出力します。

「my_script」を使用すると機能しないのはなぜですか?? そして、これを行うための「より良い」方法はありますか?

4

3 に答える 3

0

my_script には exit ステートメントが必要です。exit ステートメントを return ステートメントに置き換えます。

もう 1 つの確認事項は、同じファイルが複数のリストに含まれている可能性です。処理中に競合の問題が発生している可能性があります。ファイルはすでに処理されており、別のプロセスが同じファイルを開こうとしています。以下を使用して重複ファイルを確認します。

sort file_[1-5] | uniq -d
于 2013-06-24T11:16:24.737 に答える
0

GNU 並列の代替として、https://github.com/mauvilsa/run_parallelがあります。これは単なる bash の関数であるため、ルート アクセスやコンパイルは必要ありません。

それを使用するには、まずファイルをソースします

source run_parallel.inc.sh

次に、あなたの例では、次のように実行します

run_parallel -T 5 my_function 'list_{%}'

次のようにリストを分割することもできます

run_parallel -T 5 -l full_list -n split my_function '{@}'

使用方法の説明といくつかの例を表示するには、引数を指定せずに run_parallel を実行します。

于 2016-07-30T09:29:12.797 に答える