Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何在shell脚本中使用并行执行?_Unix_Shell_Parallel Processing_Csh - Fatal编程技术网

Unix 如何在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

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

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可能确实希望这样。