我有一个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
有什么办法可以使线2
和3
并行运行,而不是一个接一个地运行?
将其转换成具有适当依赖关系的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
表示“并行运行”