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

标签 linux bash redirect synchronization flock

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

proc1 >> output &
proc2 >> output &

问题是最终文件中的输出可能会混淆。 例如,如果第一个进程写入:

hellow

第二个进程写入:

bye

结果可能是这样的:

hebylloe

但我希望它们在单独的行中(顺序并不重要):

bye

hello

所以我使用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 &

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

最佳答案

Now I want to make sure that this solution is bulletproof. I can not find any relation between buffer size and what happens now!!!

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

If the file was open(2)ed with O_APPEND, the file offset is first set to the end of the file before writing. The adjustment of the file offset and the write operation are performed as an atomic step.

另请参阅这些答案:

关于linux - 两个进程写入一个文件,防止混合输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39061647/

相关文章:

linux - 如何在文本中对这个输出进行排序?

linux - windows和linux下独立的qt应用和依赖打包

linux - Linux 中 3 个下划线之后和点之前的子字符串

linux - 以太网 Linux 控制

bash - Gitlab.com CI/CD ssh 权限问题

bash - 如何在 if 语句中捕获错误

php - 如何将网站上不存在的链接重定向回主页

linux - 在 bash 中执行 "[]"给出了一个奇怪的错误消息.. 为什么?

redirect - 如何让 Liferay 6.1.0 在找不到资源时始终重定向到 404 页面?

javascript - jquery - ajaxStop 没有一致地执行 javascript 重定向