小编ayy*_*ani的帖子

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

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

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)

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

linux bash redirect synchronization flock

6
推荐指数
1
解决办法
3745
查看次数

标签 统计

bash ×1

flock ×1

linux ×1

redirect ×1

synchronization ×1