シェルスクリプトで2つ以上のコマンドを同時に実行する

シェルスクリプトで2つ以上のコマンドを同時に実行する

シェル スクリプトでコマンドを並列に実行すると非常に便利な場合が多いのですが、その方法が見つかりません。これは可能ですか? 可能であれば、どのように実現すればよいでしょうか? 私は主に でそれを実現することに興味がありますfish

これは、完了するまでに長い時間がかかるコマンドを同時に実行して、すべてが完了するまでの時間を短縮できる、または同時に実行する必要があるコマンドを実行する場合に便利です。

答え1

最も基本的なアプローチは&この他の答え正しいです。また、stdin、stdout、stderr をリダイレクトすることを推奨していますnohupnohup、これは必要ない場合もあります。nohupdisownの違い&そして知識に基づいた決断を下します。

もう一つのアプローチは ですparallel並列化したいコマンドが互いに似ているパターンを作成することができます。

ツールの基本バージョン(moreutils少なくともDebianの場合) を使用すると、同時に実行されるジョブの数を制限できます。GNUparallelより高度です。実行するジョブが出力を生成する場合は、次のオプションが特に役立ちます。

--group
グループ出力。各ジョブからの出力はグループ化され、コマンドが終了したときにのみ印刷されます。最初に stdout (標準出力)、次に stderr (標準エラー) が出力されます。[…]

ソース

(--groupはデフォルトで有効になっているため、通常は明示的に使用する必要はありません。)

--keep-order
-k
出力の順序を入力の順序と同じに保ちます。通常、ジョブの出力はジョブが完了するとすぐに印刷されます。[…] は-k出力が印刷される順序にのみ影響し、ジョブが実行される順序には影響しません。

ソース

これらを使用すると、複数のジョブからの出力が整理されます。これは では得られないものです&。出力は気にしなくても、順序は気にすることがあるかもしれません。私のこの答えここで、GNU は複数のプロセスを並列化し、シーケンスを保持しながら各プロセスから終了ステータスを取得するparallelために使用されます。curl

Debian では、GNU はparallelというパッケージに含まれていますparallel。個別の実行可能ファイルとして、parallel任意のシェルから実行できます。

答え2

これを行う最良の方法は、コマンドの先頭にコマンドの末尾に追加することを組み合わせることnohupです&

あなたの主な目標が何であるかは不明ですが、お役に立てれば幸いです。

Linuxマシン上でバックグラウンドプロセスとしてコマンドを実行するには、コマンドの前にnohup&最後に追加します。

したがって、最終的なコマンドは次のようになります。

nohup [your command] &

nohupコマンドが「ハングアップ」を無視することを意味し、&それに付加されたアンパサンドはシステムにコマンドをバックグラウンドプロセスとして実行するように指示するシェルコマンドです。使用方法の詳細こちらからご覧いただけます

このようなコマンドを実行すると、プロセスが実行され、コマンド プロンプトに戻され、ターミナル セッションを終了したり、ターミナル セッション中にそのコマンドとは関係のない他の操作を実行したりすることもできます。

関連情報