同じ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コマンドが失敗した場合はスクリプトが実行されない)を導入し、&
バックグラウンド実行を要求します(制御はすぐにシェルに返されます)。