【发布时间】:2016-12-27 22:46:48
【问题描述】:
我想从两个进程中获取输出并将它们合并到一个文件中,例如:
proc1 >> output &
proc2 >> output &
问题是输出可能会在最终文件中混淆。 例如,如果第一个进程写道:
你好
第二个进程写道:
再见
结果可能是这样的:
喜鹊
但我希望它们位于单独的行中,例如(顺序不重要):
再见
你好
所以我使用了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/秒。
谁能帮助我如何合并两个进程的输出并防止混合输出?
编辑: 我意识到行长和标准缓冲区大小之间存在关系,如果每行的大小小于标准缓冲区大小,那么一切都很好,没有任何混合(至少在我的测试中)。所以我用 bufsize 命令运行了每个脚本:
bufsize -o10KB proc1 | script &
bufsize -o10KB proc2 | script &
现在我想确保这个解决方案是防弹的。我找不到缓冲区大小与现在发生的情况之间的任何关系!!!
【问题讨论】:
-
如果你只有两个进程,为什么不写两个输出文件,然后合并呢?如果您需要扩大规模,请考虑使用像 log4j 这样的附加程序。
-
最好(不能解决您的问题)使用
echo "$line" >> output(带引号)。 -
你在写什么?对于普通的日志文件,读取这么多数据的英雄只会在 2 个 proc 写入同一个文件时感到困惑。或者你正在写一些有一天会进入数据库的东西?立即开始。
-
出于某种原因,我必须用 bash 脚本编写它。我知道我可以轻松处理 C++ 中的情况,但除了 bash 脚本我什么都不能使用...
-
4 Mb/秒的
output有什么用?
标签: linux bash redirect synchronization flock