假设我们有 myScript.sh ,如下所示:
#!/bin/bash
do something with $1 > bla.txt
do something with bla.txt > temp.txt
...
cat temp.txt >> FinalOuput.txt
然后我们按以下方式运行:
parallel myScript.sh {} ::: {1..3}
是否按顺序写输出? FinalOutput.txt
会先1
,然后2
,然后3
。
注意: 我正在输出单独的文件,然后在并行完成后按所需顺序合并它们,只是想知道我是否可以避免这一步。
答案 0 :(得分:2)
流程并行运行。不仅不能保证它们按顺序完成,甚至不能保证你可以让多个进程写入同一个文件,并最终得到任何有用的文件。
如果要从多个进程写入同一文件,则应实现某种锁定以防止损坏。例如:
while ! mkdir FinalOutput.lock; do
sleep 1
done
cat temp.txt >> FinalOutput.txt
rmdir FinalOutput.lock
如果 order 很重要,您应该将每个脚本写入一个唯一的文件,然后在所有并行作业完成后以正确的顺序组装最终输出。
#!/bin/bash
do something with $1 > bla.txt
do something with bla.txt > temp-$1.txt
...
cat temp.txt >> FinalOuput.txt
然后parallel
完成后:
cat temp-*.txt > FinalOutput.txt
答案 1 :(得分:1)
理想的方法是尽量避免使用临时文件。这通常可以通过使用管道来完成:
parallel 'do something {} | do more | something else' ::: * > FinalOutput
但如果这是不可能的,那么使用取决于{#}的tmpfiles,这是GNU Parallel中的作业序列号:
doer() {
do something $1 > $2.bla
do more $2.bla > $2.tmp
something else $2.tmp
}
export -f doer
parallel doer {} {#} ::: * > FinalOutput