首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何并行运行多个脚本

如何并行运行多个脚本
EN

Unix & Linux用户
提问于 2015-03-17 19:39:05
回答 3查看 3.4K关注 0票数 3

我有一个bash脚本,它以串行方式调用相同的perl脚本。bash脚本用于收集总体结果,而perl脚本则收集给定属性的模拟结果。

bash脚本如下所示:

代码语言:javascript
复制
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

EN

回答 3

Unix & Linux用户

发布于 2015-03-17 22:33:02

如果安装了gnu parallel,就可以使用命令创建脚本,例如:

代码语言:javascript
复制
../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

然后并行运行它们:

代码语言:javascript
复制
mkdir ./results/csv && parallel :::: myscript.sh

或者,调用命令并使用{} --默认替换字符串:

代码语言:javascript
复制
mkdir ./results/csv && parallel ../perlscripts/v2csv.pl -v -F {} \
results/Heterogeneous*.vec '>' ./results/csv/{}.csv ::: reach roundTrip downlink clusters

将并行运行以下命令:

代码语言:javascript
复制
../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
EN

Unix & Linux用户

发布于 2015-03-17 19:46:19

代码语言:javascript
复制
../_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
EN

Unix & Linux用户

发布于 2015-03-17 19:49:06

您可以尝试以下语法:

代码语言:javascript
复制
mkdir ./results/csv && (script0 & script1 &)

这将在后台运行脚本,而不是等待它们完成。括号引入一个子shell组(如果mkdir命令失败,就不会运行脚本),&请求后台执行(立即将控制返回到外部shell)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/190810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档