2017-04-26 67 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

你說得對 - 我一定是在想另外一個問題。 –