여러 스크립트를 병렬로 실행하는 방법

여러 스크립트를 병렬로 실행하는 방법

동일한 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

한 번에 하나씩 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 명령이 실패하면 스크립트가 실행되지 않음)을 소개하고 &백그라운드 실행을 요청합니다(제어는 즉시 쉘로 반환됩니다).

관련 정보