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

Nov 28 2020

シェルスクリプトでコマンドを並行して実行すると非常に役立つことがよくありますが、その方法が見つかりません。これは可能ですか?もしそうなら、私はそれをどのように達成しますか?私は主にそれをすることに興味がありfishます。

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

回答

5 KamilMaciorowski Nov 28 2020 at 16:03

最も基本的なアプローチはであり&、この他の答えは正しいです。また、stdin、stdout、およびstderrを推奨しますnohupが、nohupリダイレクトします。これは、必要な場合と不要な場合があります。読むの違いをnohup、disownと&して教育を受けた決定を下します。

別のアプローチはparallelです。並列化するコマンドが互いに類似していて、パターンを作成できる場合に役立ちます。

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

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

(ソース)

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

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

(ソース)

それらを使用すると、複数のジョブからの出力が整理され&ます。これは、からは得られないものです。出力は気にしないが、シーケンスは気にする場合があります。私のこの回答のように、GNUparallelを使用して複数のcurlプロセスを並列化し、各プロセスから終了ステータスを取得して、シーケンスを保持します。

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

2 Giacomo1968 Nov 28 2020 at 11:12

これを行う最良の方法はnohup、コマンドの前置きとコマンド&の最後への追加を組み合わせることです。

あなたの中心的な目標が何であるかは不明ですが、私は助けを願っています!

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

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

nohup [your command] &

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

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