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