Unix 如何在shell脚本中使用并行执行?
我有一个C shell脚本,它执行以下操作:Unix 如何在shell脚本中使用并行执行?,unix,shell,parallel-processing,csh,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 export PATH := .:${PATH} FIL
#!/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
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 $< $@
#/bin/csh
gcc示例.c-oex
gcc联合收割机.c-o联合收割机
ex file1 r1将其转换为具有适当依赖关系的生成文件。然后,您可以使用make-j
使并行运行一切可能
请注意,Makefile中的所有缩进都必须是制表符。选项卡显示要运行命令的位置
还要注意,这个Makefile现在使用GNU Make扩展名(通配符和subst函数)
可能是这样的:
#!/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
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 $< $@
导出路径:=.:${PATH}
文件=$(通配符文件*)
RFILES=$(子文件,r,${FILES})
最终:合并${RFILES}
合并${RFILES}final
rm${RFILES}
例:例
联合收割机
r%:文件%ex
ex$<$@
在bash中我会这样做
ex file1 r1 &
ex file2 r2 &
ex file3 r3 &
wait
... continue with script...
并将它们繁殖出来并行运行。你可以举另一个例子
#!/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”替换为您需要的任何数字,使得缩放到更大的数字变得微不足道。您可以使用
指令&
等待
#!/bin/csh
echo start
sleep 1 &
sleep 1 &
sleep 1 &
wait
echo ok
#!/bin/csh
回声启动
睡眠1&
睡眠1&
睡眠1&
等待
回声ok
测试:
$time./csh.sh
开始
[1] 11535
[2] 11536
[3] 11537
[3] 完成睡眠1
[2] -完成睡眠1
[1] +完成睡眠1
好啊
实0m1.008s
用户0m0.004s
sys 0m0.008s
GNU Parallel会让它看起来很像:
seq 1 3 | parallel ex file{} r{}
根据“ex”和“combine”的工作方式,您甚至可以执行以下操作:
seq 1 3 | parallel ex file{} | combine
通过观看了解有关GNU Parallel的更多信息,您可以使用ex:
xargs
可以做到:
seq 13 | xargs-n1-p0-I%ex文件%r%
-n1
表示“每输入一行,-p
表示“并行运行每行”你的-l combine
应该是-o combine
你会先把最终的
规则设置为默认值吗?我喜欢你的答案,但我刚刚意识到他的问题不止说明了3个可能的文件,而且这似乎不能很好地进行缩放。请注意运行“make-j”而不使用整数参数的习惯。它将尽可能快地继续产卵。在生成大量源文件的过程中,这可能会使机器瘫痪。一个更好的习惯是“make-j8”nohup
在这里是非常过分的。它的目标是让进程继续运行,即使shell运行的终端已关闭,这不是OP在此要求的。此外,您甚至不需要它——shell的内置disown
命令可以完成那些仅仅将stdin/stdout/stderr重定向到TTY之外无法完成的部分。此外,nohup
阻止shell发现在事件发生后是否有任何ex
命令失败,这里的OP可能确实希望这样。