web-dev-qa-db-ja.com

並列コマンドと順次コマンドを組み合わせる

1.まとめ

Linuxで並列コマンドと順次コマンドを組み合わせる方法がわかりません。


2.期待される動作

擬似コード

pip install pipenvsequentialpipenv install --dev

parallelタスク

npm install -g grunt-clisequentialnpm install

Windowsバッチ動作と同等

start cmd /C "pip install pipenv & pipenv install --dev"
start cmd /C "npm install -g grunt-cli & npm install"

3.助けられなかった

  1. 私はそうは思わない &およびwait はこの問題を解決できます。 rsawコメントを参照してください。 )
  2. GNU parallel —並列タスクにはより良い方法です と読みましたが、必要な構文が見つかりません GNU parallel で使用するには、このタスクを解決します。
  3. parallelshell を試してみます:

    parallelshell "pip install pipenv && pipenv install --dev" "npm install -g grunt-cli && npm install"
    

    フル.shファイル:

    git clone --depth 1 https://github.com/Kristinita/KristinitaPelican
    wait
    cd KristinitaPelican
    wait
    parallelshell "pip install pipenv && pipenv install --dev" "npm install -g grunt-cli && npm install"
    

    しかし、最初はpipenv install --devコマンドを実行してから、npm install。並列ではなく、順次です。

単にGNU parallel

parallel ::: 'pip install pipenv && pipenv install --dev' \
             'npm install -g grunt-cli && npm install'
2
RomanPerekhrest

Windowsコマンドに相当するUnixスタイルは次のとおりです。

(pip install pipenv && pipenv install --dev) >& pip.log &
(npm install -g grunt-cli && npm install) >& npm.log &

これにより、バックグラウンドで2つのサブシェルが開始されます。1つはpipを実行してからpipenvを実行し(pipがエラーなしで完了した場合)、もう1つは2つのnpmを実行します。コマンド。コマンドの出力の両方のセットは、物事を理解しやすくするためにログファイルにリダイレクトされます。

これらのコマンドがすべて完了するのを待ってから続行する必要がある場合は、

wait

あなたがすでに発見したように。

POSIXスタイルのシェルを使用してタスクを順序付けおよび並列化する場合、2つのツールを自由に使用できます。

  • ジョブ制御。タスクをバックグラウンドに配置し(コマンドの最後に&を使用)、タスクの完了を待つことができます(waitを使用)。
  • サブシェル。順次処理する必要のあるタスクのシリアル化など、処理の単位を好きなように分割できます。

これは、現在のタスクなどの単純な要件には十分であり、かなり長い道のりを歩むことができます。より複雑なユースケースには、より高度なツールがあります。 GNU Parallelはその1つです。より細かいリソース制御が必要な場合は、バッチツールを検討する価値もあります。

2
Stephen Kitt