我有一个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
有什么方法可以让行1
,2
和3
以并行而不是一个接一个地运行?
答案 0 :(得分:13)
将其转换为具有适当依赖关系的Makefile。然后,您可以使用make -j
让Make并行运行所有内容。
请注意,Makefile 中的所有缩进必须为TAB。 TAB显示Make运行命令的位置。
另请注意,此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 $< $@
答案 1 :(得分:8)
在bash我会这样做;
ex file1 r1 &
ex file2 r2 &
ex file3 r3 &
wait
... continue with script...
并将它们产生并行运行。您可以check out this SO thread作为另一个例子。
答案 2 :(得分:5)
#!/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.大括号扩展通过替换'在支架内3'到你需要的任何数字。
答案 3 :(得分:3)
#!/bin/csh echo start sleep 1 & sleep 1 & sleep 1 & wait echo ok
试验:
$ time ./csh.sh start [1] 11535 [2] 11536 [3] 11537 [3] Done sleep 1 [2] - Done sleep 1 [1] + Done sleep 1 ok real 0m1.008s user 0m0.004s sys 0m0.008s
答案 4 :(得分:0)
GNU Parallel会使它非常像:
seq 1 3 | parallel ex file{} r{}
根据“前”和“组合”的工作方式,您甚至可以这样做:
seq 1 3 | parallel ex file{} | combine
了解有关GNU Parallel的更多信息
答案 5 :(得分:0)
您可以使用nohup例如:
nohup ex file1 r1 &
nohup ex file2 r2 &
nohup ex file3 r3 &
答案 6 :(得分:0)
xargs
可以做到:
seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%
-n 1
用于&#34;每个输入一行&#34;,-P
用于&#34;并行运行每一行&#34;