複数の命令セットを並列に実行するには?

複数の命令セットを並列に実行するには?

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

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

ベストアンサー1

あなたが望むように

私は次の正しい構文をほとんど見つけました。

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

好きなように、しかしより良い

または必要に応じてグループ内でコマンドが失敗した場合に無視されるコマンド、構文は次のとおりです。

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

&&「」と「」はまったく異なる意味を持っていることに注意してください&。 " &&"は、前のコマンドが準備されている場合にのみコマンドが実行され、失敗せずに実行される場合(つまり、終了コードが0の場合)を意味します。 " &" は、前のコマンドがデフォルトの実行行と並列に実行され、失敗または成功が重要ではないことを意味します。

xargsツールを使う

しかし、これらの解決策には欠点がある。もう待てない後ろにみんなこれらのコマンドを実行します。これにはいくつかのトリックがあります。特に、あなたの場合、これを行うために必要なコマンドは次のとおりです。

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すべての入力ラインに対してコマンドを呼び出すことです。平行線ただし、同時に実行される子プロセスは常に最大10個です(これはで実行されます-P 10)。xargsすべてのbashプロセスが実行を完了した後にのみ、コマンドは終了します。

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

GNUは同様の名前のツールも書いていますparallel。私が知っている限り、その構文はsよりもやや明確ですが、機能が少なく一般的ではありませんxargs。おそらく他の答えはそれを説明します。

NodeJs「パラレル」モジュール

であればノードjsnpm install parallelフレームワークは主に自動化されたビルドタスクを並列化するために使用されますが、シェルスクリプトでも簡単に使用できる非常に一般的なツール()もあります。

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


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

おすすめ記事