実行したいコマンドラインを含むファイルがあります。このファイルには約 2,000 行が含まれています。
利用可能なコアは 8 つあります。ファイルを解析して 8 つのプロセスを開始し、プログラムの 1 つが終了するたびにファイルから別のプロセスを実行することは可能ですか? ファイルの終わりに達するまでこれを続けたい。
実行したいコマンドラインを含むファイルがあります。このファイルには約 2,000 行が含まれています。
利用可能なコアは 8 つあります。ファイルを解析して 8 つのプロセスを開始し、プログラムの 1 つが終了するたびにファイルから別のプロセスを実行することは可能ですか? ファイルの終わりに達するまでこれを続けたい。
GNU 並列を使用します。これは信じられないほど強力なツールであり、約 20 ほどの Linux ディストリビューション用の公式パッケージが存在します。あれは何でしょう?使えないという言い訳はありますか?コマンドのリストまたはファイルを並行して実行する方法を示す簡単な例を次に示します。
の内容jobs.txt
:
sleep 1; echo "a"
sleep 3; echo "b"
sleep 2; echo "c"
指示:
time parallel :::: jobs.txt
結果:
a
c
b
real 0m3.332s
user 0m0.170s
sys 0m0.037s
ノート:
順序を入力と同じに保ちたい場合は、-k
フラグを GNU parallel に渡します。
8 つ以上のコアがあり、8 つのコアのみで処理したい場合は-j 8
、args リストに追加します。
プロセスの最大数を使用可能なコアの数に制限しながら、xargsを使用してファイルを読み込むことができます。例えば:
cores=$(fgrep -c processor /proc/cpuinfo)
xargs --arg-file=/tmp/foo \
--max-procs=$cores \
--replace \
--verbose \
/bin/sh -c "{}"
& を使用してコマンドを実行するだけで、バックグラウンドで新しいプロセスを開始できます。ここに、問題の解決策を説明する例があります。