在继续写入文件的同时对文件进行排序

在继续写入文件的同时对文件进行排序

这似乎是一个很常见的问题,可能是重复的,但我找不到任何其他类似的问题。

我有一个类似日志文件的东西,但我也想对其进行排序,所以我有这样的东西:

echo "foo" >> file.txt
LC_ALL=C sort -k1,1 -u -o file.txt file.txt

这是一个非常小的文件(<1000 行),因此写入和排序应该非常快。然而,有时我每秒可能有 5 个事件,但其中一些会丢失。我很惊讶地看到如此低吞吐量的应用程序出现这个问题。

追加到文件每次都应该有效,因此问题可能出在排序上。我认为-o(将结果写入文件而不是标准输出)会解决并发问题,但也许不会。

如果不同的进程可能正在写入文件,是否有正确的方法对文件进行排序?

答案1

看看sort我最容易访问的实现(OpenBSD 的),如果输入文件附加到中间,看起来您会丢失数据

  • sort实用程序已完成从输入文件读取数据并开始实际排序,并且
  • 该实用程序在退出之前sort将其临时输出文件重命名为实际输出文件的名称(由参数给出)。-o

除了在排序之前暂时停止写入文件的任何进程,然后在排序完成后再次启动它们之外,我真的看不出有什么方法可以防止这种情况。这可以分别用kill -STOP和来完成kill -CONT

写入文件的进程将需要打开它以再次写入,否则它将写入不再位于目录结构中的文件(因为它已被替换)。 GNUsort似乎替换原文件内容与排序后的数据,所以这不是问题。

相关内容