19

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

有什么方法可以制作线条12并行3运行而不是一个接一个地运行?

4

7 回答 7

13

将其转换为具有适当依赖关系的 Makefile。然后,您可以使用make -jMake 并行运行所有可能的操作。

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

另请注意,此 Makefile 现在使用 GNU Make 扩展(通配符和 subst 函数)。

它可能看起来像这样:

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 $< $@
于 2010-05-07T19:13:51.700 回答
8

在 bash 我会这样做;

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

并生成它们以并行运行。您可以查看此 SO 线程以获取另一个示例。

于 2010-05-07T19:24:57.937 回答
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”替换为任何数字,可以轻松缩放到更大的数字你需要。

于 2010-05-07T19:27:15.147 回答
3

您可以使用 cmd & 并等待

#!/bin/csh
回声开始
睡觉 1 &
睡觉 1 &
睡觉 1 &
等待
回声确定

测试:

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

真正的 0m1.008s
用户 0m0.004s
系统 0m0.008s
于 2010-05-07T19:32:07.267 回答
0

GNU Parallel 会让它看起来很像:

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

根据“ex”和“combine”的工作方式,您甚至可以执行以下操作:

seq 1 3 | parallel ex file{} | combine

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

于 2010-06-11T00:41:31.377 回答
0

你可以使用nohup ex :

nohup ex file1 r1 &    
nohup ex file2 r2 &
nohup ex file3 r3 &
于 2011-02-12T01:09:56.770 回答
0

xargs可以做到:

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

-n 1用于“每个输入一行”,-P用于“并行运行每一行”

于 2015-03-23T13:03:19.513 回答