我想从两个进程得到输出并将它们合并到一个文件中,如:
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)
到本地文件系统的原子性