複数のスクリプトを並列に実行する方法

複数のスクリプトを並列に実行する方法

同じPerlスクリプトを連続して呼び出すbashスクリプトがあります。 bashスクリプトは結果全体を収集するために使用され、Perlスクリプトは特定の属性のシミュレーション結果を収集します。

Bashスクリプトは次のとおりです。

mkdir ./results/csv     && \
../perlscripts/v2csv.pl -v -F reach results/Heterogeneous*.vec > ./results/csv/reach.csv
../perlscripts/v2csv.pl -v -F roundTrip results/Heterogeneous*.vec > ./results/csv/RT.csv
../perlscripts/v2csv.pl -v -F downlink results/Heterogeneous*.vec > ./results/csv/DL.csv
../perlscripts/v2csv.pl -v -F clusters results/Heterogeneous*.vec > ./results/csv/clusters.csv

一度に1つずつPerlスクリプトを呼び出して結果を収集するのは本当に時間がかかります。私はbashスクリプトからPerlスクリプトのさまざまなバリエーションを並列に呼び出す方法を探しています。 Bashでこれを達成する方法はありますか?

明らかに、Perlスクリプトを呼び出すコマンドが何らかの方法で互いに依存することを望まない。 4つの別々のbash端末があり、それぞれがコマンドのいずれかを実行するのと同じように、すべて同じ時点で起動したいと思います。

類似: https://stackoverflow.com/questions/15644991/running-several-scripts-in-parallel-bash-script

答え1

インストールした場合は、gnu parallel次のコマンドを使用してスクリプトを作成できます。

../perlscripts/v2csv.pl -v -F reach results/Heterogeneous*.vec > ./results/csv/reach.csv
../perlscripts/v2csv.pl -v -F roundTrip results/Heterogeneous*.vec > ./results/csv/RT.csv
../perlscripts/v2csv.pl -v -F downlink results/Heterogeneous*.vec > ./results/csv/DL.csv
../perlscripts/v2csv.pl -v -F clusters results/Heterogeneous*.vec > ./results/csv/clusters.csv

その後、並列に実行します。

mkdir ./results/csv && parallel :::: myscript.sh

または、コマンドを呼び出し、デフォルト{}で文字列を-に置き換えます。

mkdir ./results/csv && parallel ../perlscripts/v2csv.pl -v -F {} \
results/Heterogeneous*.vec '>' ./results/csv/{}.csv ::: reach roundTrip downlink clusters

次のコマンドが並列に実行されます。

../perlscripts/v2csv.pl -v -F reach results/Heterogeneous*.vec > ./results/csv/reach.csv
../perlscripts/v2csv.pl -v -F roundTrip results/Heterogeneous*.vec > ./results/csv/roundTrip.csv
../perlscripts/v2csv.pl -v -F downlink results/Heterogeneous*.vec > ./results/csv/downlink.csv
../perlscripts/v2csv.pl -v -F clusters results/Heterogeneous*.vec > ./results/csv/clusters.csv

答え2

../_Cscripts/v2csv.pl -v -F reach results/Heterogeneous*.vec > ./results/csv/reach.csv &
../_Cscripts/v2csv.pl -v -F roundTrip results/Heterogeneous*.vec > ./results/csv/RT.csv &
../_Cscripts/v2csv.pl -v -F downlink results/Heterogeneous*.vec > ./results/csv/DL.csv &
../_Cscripts/v2csv.pl -v -F clusters results/Heterogeneous*.vec > ./results/csv/clusters.csv &
wait

&プログラムをバックグラウンドに置きます。興味があれば、彼らが止まるのを待ちます。

答え3

次の構文を試すことができます。

mkdir ./results/csv && (script0 & script1 &)

これにより、スクリプトが完了するのを待たずにバックグラウンドでスクリプトが実行されます。括弧はサブシェルグループ(mkdirコマンドが失敗した場合はスクリプトが実行されない)を導入し、&バックグラウンド実行を要求します(制御はすぐにシェルに返されます)。

関連情報