コマンドのグループを並行して実行しようとしています。 10個のグループがあり、各グループには3つのコマンドがあります。各グループ内で順次実行し、10グループを並列実行したい。私はこのようなものを試していますが、これはうまくいかないようです:
(command11; command12; command13 &)
(command21; command22; command23 &)
(command31; command32; command33 &)
(command41; command42; command43 &)
...
ほぼヒット。正しい構文は次のとおりです。
(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
という名前のツールを作成しました。私が知る限り、xargs
sよりも構文が少し明確ですが、機能が少なく、それほど一般的ではありません。他の回答で説明されている可能性があります。
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のジョブ制御オプションがありますが、これは勉強したいかもしれませんが、まず ビデオチュートリアル から始めます。