输出到同一文件序列

时间:2015-06-10 14:44:22

标签: bash gnu-parallel

假设我们有 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

注意: 我正在输出单独的文件,然后在并行完成后按所需顺序合并它们,只是想知道我是否可以避免这一步。

2 个答案:

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