2017-04-26 119 views
3

我有一个shell脚本job.sh在bash/linux中并行运行shell脚本

含量低于:

#!/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 

有哪些可用选项?

回答

3

你可以做

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

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

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

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

@CharlesDuffy真!在这种情况下不需要'-I'。在'printf'%s \ n“{1..20} |的情况下可能会有所帮助xargs -I%-n1 -P10 echo sqoop job --exec table%' – jm666

+0

当然,虽然在这里也可以使用'table {1..20}',并避免'-I'带来的毛羽。当然,255字节的字符串限制并不是* immediate *问题,并且以导致注入攻击的方式被滥用的倾向或POSIX指定的每个命令行(或5)的替换次数限制同样如此,但是这是一种让我感到气味的东西。 –

0

选项1

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

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

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

选项2

更多时间或存储器消耗脚本,可以在同一时间使用xargs如实施例here运行任务的数量有限。

5

简单的GNU并行

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 ... 
+0

@CharlesDuffy我没有看到它提到OP有busybox,如果运行'sqoop',我期待一个相当体面的指定机器。 –

+0

你说得对 - 我一定是在想另外一个问题。 –