2017-04-26 1 views
3

シェルスクリプトjob.shがあります。bash/linuxでシェルスクリプトを並列に実行する

内容は以下の通りです:私は./job.sh TABLE1

を行う際

#!/bin/bash 

table=$1 

sqoop job --exec ${table} 

は今、スクリプトが正常に実行されます。

ファイル名はtables.txtです。

今度はtables.txtファイルをループし、job.shスクリプトを10回並列実行します。

どうすればいいですか?

私がスクリプトを実行するときは理想的には以下のようにします。

./job.sh table1 
./job.sh table2 
./job.sh table3 
./job.sh table4 
./job.sh table5 
./job.sh table6 
./job.sh table7 
./job.sh table8 
./job.sh table9 
./job.sh table10 

どのようなオプションがありますか?

答えて

3

あなただけ並列に10個のプロセスが実行されます

< tables.txt xargs -I% -n1 -P10 echo sqoop job --exec % 

-P10を行うことができます。そして、ヘルパースクリプトも必要ありません。

@CharlesDuffyがコメントしたように、-Iは必要ありません。さらに簡単:

< tables.txt xargs -n1 -P10 echo sqoop job --exec 
+0

@CharlesDuffy真:

お仕事をご希望の場合は

-kオプションを追加し、順番に保持されます!この場合、 '-I'は必要ありません。 'printf"%sのような場合に役立ちます。\ n "{1..20} | xargs -I%-n1 -P10 echo sqoop job --exex table% ' – jm666

+0

もちろん、' table {1..20} 'も使用できますが、' -I'に付いているような毛先は避けてください。 255バイトの文字列の制限は*即時の問題ではなく、注入攻撃やPOSIX指定のコマンドライン(または5)あたりの置換数の制限につながるような方法で悪用される傾向もありますが、それはただの匂いとして私を襲うものです。 –

0

オプション1

スタート&を付加、例えばバックグラウンド・プロセスとしてすべてのスクリプト

./job.sh table1 & 
./job.sh table2 & 
./job.sh table3 & 

ただし、これは同時にすべてのジョブを実行します。スクリプトを消費するより多くの時間やメモリの場合

オプション2

hereを説明した例と同様に、あなたはxargsを使用して、同時にタスクの限られた数を実行することができます。

5

単にGNUとそれが正しいようであればサンプル出力

sqoop job --exec table7 
sqoop job --exec table8 
sqoop job --exec table9 
sqoop job --exec table6 
sqoop job --exec table5 
sqoop job --exec table4 
sqoop job --exec table3 
sqoop job --exec table2 
sqoop job --exec table1 
sqoop job --exec table10 

parallel -a tables.txt --dry-run sqoop job --exec {} 

パラレル、ちょうど--dry-runを削除し、本当のために再度実行します。

あなたは4つの仕事をご希望の場合は、一度に実行使用します。

parallel -j 4 .... 

あなたはCPUコアごとに仕事をしたい場合は、それがデフォルトなので、あなたは何もする必要はありません。

parallel -k ... 
+0

@CharlesDuffy私はOPにビジーボックスがあると言われていませんでしたが、私は 'sqoop'を実行している場合、かなり適切に指定されたマシンを期待していました。 –

+0

あなたは正しい - 私は別の質問について考えていたに違いない。 –

関連する問題