繁体   English   中英

在bash / linux中并行运行shell脚本

[英]Run shell script in parallel in bash/linux

我有一个shell脚本job.sh

内容如下:

#!/bin/bash

table=$1

sqoop job --exec ${table}

现在当我做./job.sh table1

该脚本成功执行。

我在表tables.txt文件中有表名。

现在我想遍历所有的tables.txt文件并执行job.sh并行脚本的10倍。

我怎样才能做到这一点?

理想情况下,当我执行脚本时,我希望它在下面执行;

./job.sh table1
./job.sh table2
./job.sh table3
./job.sh table4
./job.sh table5
./job.sh table6
./job.sh table7
./job.sh table8
./job.sh table9
./job.sh table10

有哪些选择?

只需使用GNU Parallel

parallel -a tables.txt --dry-run sqoop job --exec {}

样本输出

sqoop job --exec table7
sqoop job --exec table8
sqoop job --exec table9
sqoop job --exec table6
sqoop job --exec table5
sqoop job --exec table4
sqoop job --exec table3
sqoop job --exec table2
sqoop job --exec table1
sqoop job --exec table10

如果看起来正确,只需删除--dry-run并再次运行for real。

如果您希望一次运行4个作业,请使用:

parallel -j 4 ....

如果您希望每个CPU核心有一个作业,那么这是默认设置,因此您无需执行任何操作。

如果您希望按顺序保留作业,请添加-k选项:

parallel -k ...

你可以这样做

< tables.txt xargs -I% -n1 -P10 echo sqoop job --exec %

-P10将并行运行10个进程。 而你甚至不需要帮助脚本。

正如@CharlesDuffy评论的那样,你不需要-I ,例如更简单:

< tables.txt xargs -n1 -P10 echo sqoop job --exec

选项1

通过附加& ,例如,将所有脚本作为后台进程启动

./job.sh table1 &
./job.sh table2 &
./job.sh table3 &

但是,这将同时运行所有作业!

选项2

对于更多时间或内存消耗脚本,您可以使用xargs同时运行有限数量的任务,例如此处所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM