[英]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.