web-dev-qa-db-ja.com

複数のbashスクリプトを呼び出して、順番にではなく並行して実行する

3つ(またはそれ以上)のbashスクリプトがあるとします:script1.shscript2.shscript3.sh。これら3つのスクリプトをすべて呼び出して、parallelで実行したいと思います。これを行う1つの方法は、次のコマンドを実行することです。

Nohup bash script1.sh &
Nohup bash script2.sh &
Nohup bash script3.sh &

(通常、スクリプトが完了するまでに数時間または数日かかる場合があるため、コンソールが閉じてもスクリプトが実行され続けるようにNohupを使用したいと思います。)

しかし、singleを呼び出してparallelでこれら3つのコマンドを実行する方法はありますか?

私は何かを考えていました

Nohup bash script{1..3}.sh &

しかし、これはscript1.shscript2.shscript3.sh並列ではなく、順番に。

20
Andrew
for((i=1;i<100;i++)); do Nohup bash script${i}.sh & done
15
Hauke Laging

より良い方法は GNU Parallel を使用することです。 GNU parallelは単純であり、それを使用すると、ジョブをより詳細に制御して、並列に実行するジョブの数を制御できます。

以下のコマンドでは、script{1..3}.shが展開され、bashへの引数として並行して送信されます。ここで-j0は、できるだけ多くのジョブを実行する必要があることを示しています。デフォルトでは、parallelは1つのCPUコアに対して1つのジョブを実行します。

$ parallel -j0 bash :::: <(ls script{1..3}.sh)

そして、あなたも使用してみることができます

$ parallel -j0 bash ::: script{1..3}.sh

2番目のメソッドを実行しているときにエラーメッセージが表示された場合、--tollefオプションが/etc/parallel/configに設定されているため、削除する必要があり、すべてが正常に機能します。

より豊富なオプションについては、GNU Parallelsのマニュアルページ ここ を参照してください。

また、リモートマシンからジョブを実行している場合は、 screen を使用して、ネットワークの問題が原因でセッションが閉じないようにすることをお勧めします。最近のバージョンのbashにはNohuphuponexitとして付属しているため、offは必要ありません。これにより、親シェルが終了時に__shellを子にHUP信号で送信できなくなります。設定されていない場合は、

$ shopt -u huponexit  
14
Kannan Mohan

xargsを使用して、複数のスクリプトを並行して実行することもできます。

$ ls script{1..5}.sh|xargs -n 1 -P 0 bash

ここで、各スクリプトは引数として個別にbashに渡されます。 -P 0は、並列処理の数をできるだけ多くできることを示します。また、bashのデフォルトjob control feature(&)を使用する方が安全です。

9
Yaalie

単一のlineソリューション:

$ Nohup bash script1.sh & Nohup bash script2.sh & Nohup bash script3.sh &

面倒ではなく、ラッパースクリプトを使用するだけです。

$ cat script.sh
#!/usr/bin/env bash
script1.sh &
script2.sh &
script3.sh &
$ Nohup script.sh &

またはそれらをループします:

for script in dir/*.sh
do
    Nohup bash "$script" &
done
5
l0b0

タイピングの手間を省きたい場合

eval "Nohup bash "script{1..3}.sh" &"

または考え直し、多分そうではない

2
iruvar

このツールをチェックアウトしてください: https://github.com/wagoodman/bashful

あなたがmytasks.yamlを持っているとしましょう

tasks:
    - name: A title for some tasks
      parallel-tasks:
        - cmd: ./script1.sh
        - cmd: ./script2.sh -x an-arg
        - cmd: ./script3.sh -y some-other-arg

そしてあなたはそれを次のように実行します:

Nohup bashful run mytasks.yaml

スクリプトは、垂直の進行状況バーと並行して実行されます(以前に実行したことがあり、時間が確定的である場合は+ eta)。ここで指定された3つ以上のタスクを実行し始めた場合は、並行して実行するタスクの数を調整できます。

config:
    max-parallel-commands: 6
tasks:
    ...

免責事項:私は著者です。

1
wagoodman

Parallelshellを使用する

parallelshell "echo 1" "echo 2" "echo 3"

https://github.com/keithamus/parallelshell

0
rofrol

私が書いたばかりのはるかに単純なユーティリティを提案しています。現在parと呼ばれていますが、まもなくparlまたはpllに名前が変更されますが、まだ決定されていません。

https://github.com/k-bx/par

APIは次のように単純です。

par "script1.sh" "script2.sh" "script3.sh"
0