回答:
GNU parallel
はこの種のものに最適です。インストールしsudo apt install parallel
てから:
parallel -j0 ::: my_folder/*sh
-j
tは並行して実行どのように多くのプロセスコントロール、および-j0
手段「それらのすべて」。-j20
代わりに別の値(たとえば)に設定して、スクリプトをバッチで実行します。
parallel
からのコマンドもありmoreutils
ます。使用例:parallel -j 20 -- my_folder/*.sh
(GNU parallel
と-j0
は異なり、スクリプトは一度に1つずつ実行されます)。
sudo apt install parallel
、このファイルは/usr/bin/parallel
GNU Parallelのファイルに置き換えられます。したがって、インストールすると、私の答えが示唆するように、期待どおりに機能するはずです。
parallel
GNUパラレルを提案するための私の答えを書いている間に、マニュアルからコマンドを失敗させようとしたとき、私はそれが難しい方法だとわかりました。
すべてのスクリプトを同時に(並行して)実行するには、次のコマンドを使用します。
script_1.sh &
script_2.sh &
script_3.sh &
script_4.sh &
script_5.sh &
次々と(順番に)実行するには:
script_1.sh &&
script_2.sh &&
script_3.sh &&
script_4.sh &&
script_5.sh
同時に実行する200のスクリプトがある場合(マシンBTWを停止する可能性があります)、次のスクリプトを使用します。
#!/bin/bash
for Script in my_folder/*.sh ; do
echo bash "$Script" &
done
次のコマンドを使用して、スクリプト属性を実行可能に設定します。
chmod a+x /path/to/script.sh
スクリプトを初めて実行するときは、実行する200個のスクリプトの名前のみがエコーされます。適切な名前が選択されたら、スクリプトを編集して次の行を変更します。
echo bash "$Script" &
に:
bash "$Script" &
ここで回答したように、bashスクリプトを別のスクリプトから呼び出すには3つの方法があります。
他のスクリプトを実行可能に
#!/bin/bash
して、先頭に行を追加し、ファイルがある場所のパスを$PATH
環境変数に追加します。その後、それを通常のコマンドとして呼び出すことができます。または、次のようにソースコマンド(エイリアスは。)を使用して呼び出し
source /path/to/script
ます。または、bashコマンドを使用して実行します
/bin/bash /path/to/script
。
OPの場合、200スクリプトの1つ以上に#!/bin/bash
ファイルのシバンの最初の行が含まれていませんでした。そのため、オプション3.を使用する必要がありました。
それらが「同時に実行されている」かどうかについてのコメントがありました。典型的な8 CPUシステムでは、25のスクリプトが同時に1つのCPUを共有しますが、タイムスライス(ミリ秒で測定)がなくなるまで一度に1つのスクリプトのみが実行されます。その後、次のジョブはミリ秒の公平なシェアを受け取り、次に次のジョブなどを受け取ります。
大まかに言えば、200個のジョブが8つのCPUで「同時に」実行されているのではなく、同時に実行されていると言えます。つまり、CPUあたり25個のジョブに相当します。
上記の画像と以下のLinuxカーネルスケジューラからのコメント
bash
、スクリプトを呼び出すためのプレフィックスを含めました。
これのためのツールがあります、読んでくださいman run-parts
。
たとえば、私はします:
run-parts ${visorhome}/pbackup.d/
Palm Pilotバックアップスクリプトで。${visorhome}/pbackup.d/
:
01PopulateJpilot 02Extract_Pedometer 03URLs 04google 05Books 06Weight 07Sec 08Bkgm 50hardlinks
run-parts
OPが要求したように、一度にすべてではなく逐次的にスクリプトを実行することについて言及したいと思うかもしれません。ただし、一度に200のスクリプトを実行しても、5を実行した場合と同じように機能することはほとんどありません。一度にすべてを実行しても問題が発生しない場合でも、不要な場合があります。私は、OPがこの点で彼らの好みを明確にするようにコメントしました。
run-parts
スクリプトを実行しません(名前にドットが含まれています:my_folder/*.sh
を使用して*.sh
、my_folder
ディレクトリ内のすべてのスクリプトを同時に実行するにはxargs
:
$ ls my_folder/*.sh | xargs -P0 -n1 bash
同時に実行されるスクリプトの数を以下に制限するには10
:
$ ls my_folder/*.sh | xargs -P10 -n1 bash
ls
スクリプトでの出力を使用することは悪い習慣です。使用する方find
がはるかに安全です。これが最初のアイテムです:mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29