我想从两个进程中获取输出并将它们合并到一个文件中,例如:
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)
现在我想确保这个解决方案是防弹的。我找不到缓冲区大小与现在发生的事情之间的任何关系!!!