两个进程写入一个文件,防止混合输出

我想从两个进程得到输出并将它们合并到一个文件中,如:

proc1 >> output & proc2 >> output & 

问题是输出可能会混在最终的文件中。 例如,如果第一个进程写入:

hellow

第二个过程写道:

再见

结果可能是这样的:

hebylloe

但我希望他们像(顺序不重要)分开行:

再见

你好

所以我用flock通过下面的脚本同步写入文件:

 exec 200>>output while read line; flock -w 2 200 do echo $line>>output flock -u 200 done 

并运行如下的过程:

 proc1 | script & proc2 | script & 

现在的问题是性能显着下降。 没有同步,每个进程可以以4MB / sec的速度写入,但使用同步脚本的写入速度是1MB / sec。

任何人都可以帮助我如何合并两个进程的输出,并防止混合输出?

编辑:我意识到,行长度和标准缓冲区大小之间有一个关系,如果每行的大小小于标准缓冲区大小,那么每件事情都很好,没有什么是混合的(至less在我的testing中)。 所以我用bufsize命令运行了每个脚本:

 bufsize -o10KB proc1 | script & bufsize -o10KB proc2 | script & 

现在我想确保这个解决scheme是防弹的。 我找不到缓冲区大小和现在发生的任何关系!

现在我想确保这个解决方案是防弹的。 我找不到缓冲区大小和现在发生的任何关系!

对于完全缓冲的输出流,缓冲区大小决定了使用单个write(2)调用write(2)的数据量。 对于行缓冲输出流,只要不超过缓冲区大小,就会使用单个write(2)调用write(2)一行。

如果使用O_APPEND 打开 (2)文件,则在写入之前,文件偏移量将首先设置为文件末尾。 文件偏移和写操作的调整是作为原子步骤执行的。

另请参阅以下答案:

  • write(2)到本地文件系统的原子性
  • 了解来自多个进程的并发文件写入