Como executar vários scripts em paralelo

3

Eu tenho um script bash que chama o mesmo script perl de maneira serial. O script bash é usado para coletar os resultados gerais, enquanto o script perl coleta os resultados das minhas simulações para os atributos fornecidos.

O script bash tem a seguinte aparência:

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

Coletar os resultados chamando um script perl de cada vez é muito longo; Eu estou procurando uma maneira que me permita chamar as diferentes variações do script perl dentro do script bash em paralelo. Existe uma maneira de conseguir isso em bash?

Só para esclarecer, não quero que os comandos que chamam o script perl dependam uns dos outros de alguma forma. Eu quero que todos eles comecem no mesmo ponto no tempo, como se eu tivesse 4 terminais bash separados executando cada um desses comandos.

Similar: link

    
por cross 17.03.2015 / 20:39

3 respostas

5

Se você tiver gnu parallel instalado, poderá criar um script apenas com os comandos, por exemplo:

../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

e depois executá-los em paralelo:

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

Como alternativa, invocar o comando e usar {} - a string de substituição padrão:

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

executaria os seguintes comandos em paralelo:

../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
    
por 17.03.2015 / 23:33
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

O & coloca o programa em segundo plano. wait espera que eles parem se você se importa.

    
por 17.03.2015 / 20:46
1

Você pode tentar a seguinte sintaxe:

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

Isso executará os scripts em segundo plano, não esperando que eles sejam concluídos. Os parênteses introduzem um grupo subshell (para que nenhum script seja executado se o comando mkdir falhar) e o & solicita execução em segundo plano (retornando o controle para o shell externo imediatamente).

    
por 17.03.2015 / 20:49