
シェル スクリプトでコマンドを並列に実行すると非常に便利な場合が多いのですが、その方法が見つかりません。これは可能ですか? 可能であれば、どのように実現すればよいでしょうか? 私は主に でそれを実現することに興味がありますfish
。
これは、完了するまでに長い時間がかかるコマンドを同時に実行して、すべてが完了するまでの時間を短縮できる、または同時に実行する必要があるコマンドを実行する場合に便利です。
答え1
最も基本的なアプローチは&
、この他の答え正しいです。また、stdin、stdout、stderr をリダイレクトすることを推奨していますnohup
がnohup
、これは必要ない場合もあります。nohup
とdisown
の違い&
そして知識に基づいた決断を下します。
もう一つのアプローチは です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
コマンドが「ハングアップ」を無視することを意味し、&
それに付加されたアンパサンドはシステムにコマンドをバックグラウンドプロセスとして実行するように指示するシェルコマンドです。使用方法の詳細こちらからご覧いただけます。
このようなコマンドを実行すると、プロセスが実行され、コマンド プロンプトに戻され、ターミナル セッションを終了したり、ターミナル セッション中にそのコマンドとは関係のない他の操作を実行したりすることもできます。