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

ayy*_*ani 6 linux bash redirect synchronization flock

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

proc1 >> output &
proc2 >> output &
Run Code Online (Sandbox Code Playgroud)

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

你好

第二个过程写道:

再见

结果可能类似于:

海贝罗

但我希望它们在单独的行中(顺序不重要):

再见

你好

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

exec 200>>output
while read line;
  flock -w 2 200
  do echo $line>>output
  flock -u 200
done
Run Code Online (Sandbox Code Playgroud)

并运行如下进程:

proc1 | script &
proc2 | script &
Run Code Online (Sandbox Code Playgroud)

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

谁能帮助我如何合并两个进程的输出并防止混合输出?

编辑:我意识到行长度和 std 缓冲区大小之间存在关系,如果每行的大小小于 std 缓冲区大小,那么一切都很好,没有任何混合(至少在我的测试中)。所以我用 bufsize 命令运行了每个脚本:

bufsize -o10KB proc1 | script &
bufsize -o10KB proc2 | script &
Run Code Online (Sandbox Code Playgroud)

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

Arm*_*ali 2

现在我想确保这个解决方案是万无一失的。我找不到缓冲区大小和现在发生的事情之间的任何关系!

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

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

另请参阅这些答案: