2017-10-06 34 views
3

私は次のループを並列に実行するwhileループを持っています。 (logProcessは、私が以前に私のスクリプトで定義する機能です。)bashでwhileループを並列化する方法は?

while read LINE; do 
    logProcess $LINE & 
done <<< "$ELS_LOGS" 
wait 

私は、実行中のプロセスの数を制限する方法を見つける必要があります。私は、並列プロセスが動作していることを知っています。どのようにループをそのコマンドを使用するように変換するのですか?

+0

ループ内にps -efとgrep * log *プロセスがあり、行数[wc -l]を確認できます。それが実行したいプロセスの数より多い場合は、プロセスの1つが完了するまでスリープしてから、新しいlogProcessを再度開始することができます。 は必要なものですか? –

+0

'logProcess" $ LINE "ではなく' logProcess $ LINE'ですか? '*'を含む行があれば、コマンドラインに置かれたファイル名のリストを得ることに留意してください。 –

答えて

2

GNU Parallelをお勧めします。あなたの全体のスクリプトはなる:

parallel -a "$ELS_LOGS" logProcess 

logProcessは、スクリプト内で定義された関数であるならば、あなたはこのように、パラレルGNUを実行する前に、まずそれをエクスポートする必要があります。

export -f logProcess 

を次に場合8が一度に実行されている、たとえば、したい、あなたは単に実行します。

parallel -j 8 -a "$ELS_LOGS" logProcess 

あなたはそれが何をするのか確認したい場合は、実際のdoinなしグラム何も:

parallel --dry-run ... 

あなたは、プログレスバー、またはETAたい場合:GNU xargs

parallel --eta ... 
parallel --bar ... 
+0

スクリプトにはより多くの機能が含まれており、上記のように実行することはできません。理想的には、私はループ部分を並列化する必要があります。 –

+0

私が理解しているかわかりません - 私が示唆していることは、あなたが求めたものと同じです。あなたの質問はあなたが望むものを代表するものではありませんか? –

+0

@MatthewBullock、あなたの関数が他の関数を呼び出す場合は、それらの他の関数もエクスポートします*。これとは対照的に、関数がグローバルな共有状態を変更する必要がある場合、シェルではできないジョブがあります(ディスクや他の外部ストアを使用せずに調整できます)。シェルはスレッドをサポートしません同じ可変状態を共有する実行)。代わりに、* all *オプションはマルチプロセッシングスタイルです。各サブプロセスには独自の変数、作業ディレクトリなどがあります。 –

1

のも仕事のための適切なツールです。

xargs -P 20 -d $'\n' -n 1 logProcess 

...します最大同時実行数はlogProcessであり、標準入力の各行はxargsに渡され、異なるインスタンスに渡されます。

関連する問題