输出到同一个文件序列

Output to the same file sequence

假设我们有 myScript.sh 如下:

#!/bin/bash
do something with  > bla.txt
do something with bla.txt > temp.txt
...
cat temp.txt >> FinalOuput.txt

然后我们运行并行如下:

parallel myScript.sh {} ::: {1..3}

是否按顺序写入输出? FinalOutput.txt 会先有 1 的结果,然后是 2,然后是 3

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

这些进程是 运行 并行的。不仅不能保证它们会按顺序完成,甚至不能保证您可以让多个进程像这样写入同一个文件并最终得到有用的东西。

如果您要从多个进程写入同一个文件,您应该实施某种锁定以防止损坏。例如:

while ! mkdir FinalOutput.lock; do
    sleep 1
done

cat temp.txt >> FinalOutput.txt
rmdir FinalOutput.lock

如果 order 很重要,您应该将每个脚本写入一个唯一的文件,然后 assemble 在所有并行作业完成后以正确的顺序输出最终结果.

#!/bin/bash
do something with  > bla.txt
do something with bla.txt > temp-.txt
...
cat temp.txt >> FinalOuput.txt

然后在 parallel 完成后:

cat temp-*.txt > FinalOutput.txt

理想的方法是避免使用临时文件。这通常可以通过使用管道来完成:

parallel 'do something {} | do more | something else' ::: * > FinalOutput

但如果那是不可能的,那么使用依赖于 {#} 的 tmpfiles,它是 GNU Parallel 中的作业序列号:

doer() {
  do something  > .bla
  do more .bla > .tmp
  something else .tmp
}
export -f doer
parallel doer {} {#} ::: * > FinalOutput