如何在shell脚本中使用并行执行?

我有一个C shell脚本,可以这样做:

#!/bin/csh gcc example.c -o ex gcc combine.c -o combine ex file1 r1 <-- 1 ex file2 r2 <-- 2 ex file3 r3 <-- 3 #... many more like the above combine r1 r2 r3 final \rm r1 r2 r3 

有什么办法可以使线23 并行运行,而不是一个接一个地运行?

将其转换成具有适当依赖关系的Makefile。 然后你可以使用make -j让并行运行所有的东西。

请注意,Makefile中的所有缩进都必须是TAB。 TAB显示要运行的命令的位置。

还要注意,这个Makefile现在使用GNU Make扩展(通配符和子功能)。

它可能看起来像这样:

 export PATH := .:${PATH} FILES=$(wildcard file*) RFILES=$(subst file,r,${FILES}) final: combine ${RFILES} combine ${RFILES} final rm ${RFILES} ex: example.c combine: combine.c r%: file% ex ex $< $@ 

在bash我会做;

 ex file1 r1 & ex file2 r2 & ex file3 r3 & wait ... continue with script... 

并且产生它们并行运行。 你可以看看这个SO线程的另一个例子。

 #!/bin/bash gcc example.c -o ex gcc combine.c -o combine # Call 'ex' 3 times in "parallel" for i in {1..3}; do ex file${i} r${i} & done #Wait for all background processes to finish wait # Combine & remove combine r1 r2 r3 final rm r1 r2 r3 

我略微改变了代码,使用括号扩展{1..3}而不是硬编码的数字,因为我刚刚意识到你说,有更多的文件,而不仅仅是3. Brace扩展缩放到更大的数字琐碎通过替换'3'在大括号里面,无论你需要什么号码。

你可以使用cmd&然后等待

 #!/ bin中/ CSH
回声开始
睡1&
睡1&
睡1&
等待
回声确定

测试:

 $ time ./csh.sh 
开始
 [1] 11535
 [2] 11536
 [3] 11537
 [3]完成睡眠1
 [2]  - 完成睡眠1
 [1] +完成睡眠1
好

真正的0m1.008s
用户0m0.004s
 sys 0m0.008s

你可以用nohup ex:

 nohup ex file1 r1 & nohup ex file2 r2 & nohup ex file3 r3 & 

GNU并行将使它很像:

 seq 1 3 | parallel ex file{} r{} 

根据“前”和“结合”的工作方式,你甚至可以这样做:

 seq 1 3 | parallel ex file{} | combine 

通过观看http://www.youtube.com/watch?v=LlXDtd_pRaY了解有关GNU Parallel的更多信息

xargs可以做到这一点:

seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%

-n 1表示“每个输入一行”, -P表示“并行运行”