3つ(またはそれ以上)のbashスクリプトがあるとします:script1.sh
、script2.sh
、script3.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.sh
、script2.sh
、script3.sh
並列ではなく、順番に。
for((i=1;i<100;i++)); do Nohup bash script${i}.sh & done
より良い方法は 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にはNohup
がhuponexit
として付属しているため、off
は必要ありません。これにより、親シェルが終了時に__shellを子にHUP
信号で送信できなくなります。設定されていない場合は、
$ shopt -u huponexit
xargs
を使用して、複数のスクリプトを並行して実行することもできます。
$ ls script{1..5}.sh|xargs -n 1 -P 0 bash
ここで、各スクリプトは引数として個別にbashに渡されます。 -P 0
は、並列処理の数をできるだけ多くできることを示します。また、bashのデフォルトjob control feature
(&)
を使用する方が安全です。
単一の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
タイピングの手間を省きたい場合
eval "Nohup bash "script{1..3}.sh" &"
または考え直し、多分そうではない
このツールをチェックアウトしてください: 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:
...
免責事項:私は著者です。
Parallelshellを使用する
parallelshell "echo 1" "echo 2" "echo 3"
私が書いたばかりのはるかに単純なユーティリティを提案しています。現在parと呼ばれていますが、まもなくparlまたはpllに名前が変更されますが、まだ決定されていません。
APIは次のように単純です。
par "script1.sh" "script2.sh" "script3.sh"