web-dev-qa-db-ja.com

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

同じPerlスクリプトをシリアルに呼び出すbashスクリプトが1つあります。 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スクリプトを呼び出すコマンドが相互に依存することは望ましくありません。それぞれがこれらのコマンドの1つを実行する4つの別々のbash端末があるかのように、それらすべてを同じ時点で開始する必要があります。

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

3
cross

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
5
don_crissti
../_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

&はプログラムをバックグラウンドに置きます。気になったら、彼らが止まるのを待ちます。

2
Robert Jacobs

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

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

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

1
dhag