シェルスクリプトで2つ以上のコマンドを同時に実行する
シェルスクリプトでコマンドを並行して実行すると非常に役立つことがよくありますが、その方法が見つかりません。これは可能ですか?もしそうなら、私はそれをどのように達成しますか?私は主にそれをすることに興味がありfish
ます。
完了するのに長い時間がかかるが、すべてが完了するのにかかる時間を短縮するために同時に実行できる、または実行する必要があるコマンドを実行している場合に便利です。
回答
最も基本的なアプローチはであり&
、この他の答えは正しいです。また、stdin、stdout、およびstderrを推奨しますnohup
が、nohup
リダイレクトします。これは、必要な場合と不要な場合があります。読むの違いをnohup、disownと&して教育を受けた決定を下します。
別のアプローチはparallel
です。並列化するコマンドが互いに類似していて、パターンを作成できる場合に役立ちます。
ツールの基本的なバリアント(moreutils
少なくともDebianでは)を使用すると、同時に実行されるジョブの数を制限できます。GNUparallelはもっと進んでいます。実行するジョブが出力を生成する場合は、次のオプションが特に役立ちます。
--group
グループ出力。各ジョブからの出力はグループ化され、コマンドが終了したときにのみ出力されます。最初にstdout(標準出力)、次にstderr(標準エラー)。[…]
(ソース)
(--group
デフォルトで有効になっているため、通常は明示的に使用する必要はありません。)
--keep-order
-k
出力の順序を入力の順序と同じに保ちます。通常、ジョブの出力は、ジョブが完了するとすぐに印刷されます。[…]-k
は、出力が印刷される順序にのみ影響し、ジョブが実行される順序には影響しません。
(ソース)
それらを使用すると、複数のジョブからの出力が整理され&
ます。これは、からは得られないものです。出力は気にしないが、シーケンスは気にする場合があります。私のこの回答のように、GNUparallel
を使用して複数のcurl
プロセスを並列化し、各プロセスから終了ステータスを取得して、シーケンスを保持します。
Debianでは、GNUparallel
はparallel
。という名前のパッケージに含まれています。別の実行可能ファイルとして、parallel
任意のシェルから実行できます。
これを行う最良の方法はnohup
、コマンドの前置きとコマンド&
の最後への追加を組み合わせることです。
あなたの中心的な目標が何であるかは不明ですが、私は助けを願っています!
Linuxマシンでバックグラウンドプロセスとしてコマンドを実行するには、コマンドの前にコマンドをnohup追加&
し、最後に追加する必要があります。
したがって、最終的なコマンドは次のようになります。
nohup [your command] &
これnohup
は、コマンドが「ハングアップ」を無視する必要があることを意味し、&
それに追加されるアンパサンドは、バックグラウンドプロセスとしてコマンドを実行するようにシステムに指示するシェルコマンドです。使用法の詳細については、こちらをご覧ください。
このようなコマンドを実行すると、プロセスが実行され、コマンドプロンプトに戻り、ターミナルセッションを終了したり、ターミナルセッション中にそのコマンドに関係のないことを実行したりすることができます。