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

时间:2016-08-21 06:59:51

标签: linux bash redirect synchronization flock

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

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 /秒的速度写入,但使用同步脚本,写入速度为1MB /秒。

任何人都可以帮我解决如何合并两个进程的输出并防止混合输出的问题吗?

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

另见这些答案: