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

时间:2010-05-07 19:09:21

标签: unix shell parallel-processing csh

我有一个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

有什么方法可以让行123并行而不是一个接一个地运行?

7 个答案:

答案 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)

你可以用 cmd&amp; 等待

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

通过观看http://www.youtube.com/watch?v=LlXDtd_pRaY

了解有关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;