运行 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 ...
我有一个 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 ...