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

Run shell script in parallel in bash/linux

我有一个 shell 脚本 job.sh

内容如下:

#!/bin/bash

table=

sqoop job --exec ${table}

现在当我做./job.sh table1

脚本执行成功。

我在文件 tables.txt 中有 table 个名称。

现在我想遍历 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

有哪些可用选项?

选项 1

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

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

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

选项 2

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

中所述

你可以做到

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

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

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

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

只需使用 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 和 运行。

如果您希望同时处理 4 个作业 运行,请使用:

parallel -j 4 ....

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

如果您希望作业保持有序,请添加 -k 选项:

parallel -k ...