我有两个应用程序用于传输数据:
应用程序1 | 应用程序2
基本上,应用程序 1 会生成一个日志,其中包含应用程序 2 处理的事件。问题是我经常更新应用程序 2。这意味着,我需要停止这些更新,更新二进制文件,然后重新启动它。在那段短暂的时间内,应用程序 1 可能会丢失数据。
我读到过有关使用命名管道的文章mkfifo
,并认为这可能是一个理想的解决方案。保持应用程序 1 运行,并让它写入文件支持的命名管道,这样当应用程序更新时不会丢失数据,并且一旦应用程序 2 启动,它就会获取数据。
测试cat
模拟读取器/写入器是否有效,直到不再有读取器。这是意料之外的。
另一种方法是使用实际文件,但存在问题:
- 它保留在磁盘上,不像 FIFO 那样运行
- 它需要某种形式的轮换来防止文件变得过大
- 据我所知,当读取器位于末尾(尾部?)时,如果文件大小增加,则需要在计时器后面进行探测,从而增加处理延迟
我控制着阅读器,目前的行为是它会自动重启,但我无法控制写入器。我只能将其输出通过管道传输到其他地方。
- 是否可以以某种方式配置命名管道以使其持久?
- 我读到过作者关于“固定”到管道的内容,但我无法让它发挥作用
- 一旦读者退出,我可以防止管道关闭吗?
- 有没有像管道一样运作的替代品?
解决方案https://unix.stackexchange.com/a/784153/585995有效!
mkfifo /tmp/mypipe
writerapp 1<>/tmp/mypipe
当我重新启动阅读器时,编写器继续运行:
readerapp </tmp/mypipe
顺便说一句,你可以自己使用以下方法测试一下cat