web-dev-qa-db-ja.com

コマンドのグループを並行して実行する方法は?

コマンドのグループを並行して実行しようとしています。 10個のグループがあり、各グループには3つのコマンドがあります。各グループ内で順次実行し、10グループを並列実行したい。私はこのようなものを試していますが、これはうまくいかないようです:

(command11; command12; command13 &)
(command21; command22; command23 &)
(command31; command32; command33 &)
(command41; command42; command43 &)
...
4
user3769454

あなたの好きなように

ほぼヒット。正しい構文は次のとおりです。

(command11; command12; command13) &
(command21; command22; command23) &
(command31; command32; command33) &
(command41; command42; command43) &

あなたが望むように、しかしより良い

または、コマンドが失敗した後にグループ内コマンドを省略したい場合、構文は次のようになります。

command11 && command12 && command13 &
command21 && command22 && command23 &
command31 && command32 && command33 &
command41 && command42 && command43 &

&&」の意味は「&」とは非常に異なります。 「&&」は、前のコマンドの準備ができてから、コマンドが失敗せずに実行された場合(つまり、終了コードがゼロの場合)にのみコマンドが実行されることを意味します。 「&」は、メインの実行ラインと並行して実行される前のコマンドであり、その失敗または成功は問題ではありません。

xargsツールの使用

ただし、これらのソリューションには、これらのコマンドのallの実行後に待てないの欠点があります。そのために、もう少し注意が必要です。特にあなたの場合、これを行うために必要なコマンドは次のようになります

for i in 1 2 3 4 5 6 7 8 9 10
do
  echo "command${i}1 && command${i}2 && command${i}3"
done | xargs -P 10 -l 1 bash -c

非常に便利なxargsツールを使用しています。もちろん、何でもパイプすることができます。たとえば、10個のスレッドで何千もの処理を並列処理したい場合は、処理します。

入力のすべての行に対してコマンドbash -cを呼び出す方法parallelですが、常に最大で10の子プロセスが同時に実行されます(これは、 -P 10)。 xargsコマンドは、すべてのbashプロセスが実行された場合にのみ終了します。

並列ツール(他の回答を参照)

GNUもparallelという名前のツールを作成しました。私が知る限り、xargssよりも構文が少し明確ですが、機能が少なく、それほど一般的ではありません。他の回答で説明されている可能性があります。

NodeJの「並列」モジュール

nodejsフレームワークで作業している場合、非常に一般的に使用されるツール(npm install parallel)もあります。これは、主に自動化されたビルドタスクの並列化に使用されますが、シェルスクリプトでも使用できます簡単に。

npmパッケージはUnixのパケット処理環境とうまく統合されないため、これは一般的な環境ではあまり良い考えではありません。構文ははるかに簡単ですが、その機能は他のすべてのソリューションよりもはるかに遅れています。


あなたの特定の問題の場合、私はおそらく単純なケースでは2番目のソリューションを選択し、より複雑なケースではxargsベースのソリューションを選択します。

GNU Parallelの場合:

parallel 'command{}1; command{}2; command{}3' ::: {1..4}

または、必要に応じてコマンド置換

parallel 'command{}1; command{}2; command{}3' ::: $(seq 4)

GNU Parallelには、約150のジョブ制御オプションがありますが、これは勉強したいかもしれませんが、まず ビデオチュートリアル から始めます。

5
hschou