查看应用程序中的多个数据流

查看应用程序中的多个数据流

我正在运行最新的 Ubuntu LTS 并编写了一个与机器交互的应用程序。该机器有多个传感器和多个 PID 回路用于温度控制。数据输入速度非常快,大约每秒 20 个读数。在测试过程中,我希望能够以单独的流的形式访问其中的每一个。这样我就可以安排一些终端来“主”查看正在发生的一切。

我当前的解决方案是只为每个流提供文件,并让应用程序在读取时附加必要的文件。然后我只需输入“tail -f /tmp/Pressure.log”之类的命令,就可以开始了。

这是一次性数据,因此我目前将它们放入 /tmp 中,以便将其清除。但这是大量的写​​入操作,并且文件大小可能会变得很大。理想情况下,应用程序会写入 /dev 中的某些内容,我可以像我正在做的那样跟踪这些内容。

那么,让应用程序流文本可以在单独的进程中查看的最佳方法是什么?理想情况下,我希望对我的应用程序进行尽可能少的更改。谢谢大家!

答案1

将数据从一个应用程序流式传输到另一个应用程序而不永久保存的普通 UNIX 方式是管道。在外壳中:

data-producer | data-consumer

您始终可以将命名管道用于比单个生产者发出和单个消费者接收更复杂的模式:

# Set up the pipes
mkfifo /tmp/pressure.fifo
mkfifo /tmp/temperature.fifo

# Start the emiters
monitor-pressure >/tmp/pressure.fifo
monitor-temperature >/tmp/temperature.fifo

# Take input from multiple places
collect-and-analyse-all-data /tmp/pressure.fifo /tmp/temperature.fifo

管道(无论是常规的未命名还是命名)在这种情况下有一些缺点:

  • 在消费者运行或准备好读取数据之前,生产者将阻塞,否则管道将缓冲数据到某个点然后阻塞。对于数据记录器来说,当没有人监听时丢弃数据可能比缓冲数据或阻止进程更好。这取决于您的应用程序。
  • 如果消费者停止运行或关闭管道,生产者在尝试写入管道时将收到错误。这会导致幼稚的程序中止。可以忽略错误并继续尝试,直到消费者再次打开管道(仅适用于命名管道),但您必须做更多的工作才能实现这一点。

UNIX 具有丰富的 IPC 机制,您也可以从许多其他机制中进行选择:

  • 无限增长的临时文件(这听起来就像你现在正在做的事情)
  • 临时文件,其数据不断被最新数据项替换。简单,但脆弱,以防消费者在替换之前没有时间读取数据项。
  • 临时文件增长到一定程度然后进行旋转。在生产者和消费者方面需要实施更多工作才能使同步正常工作并且在文件轮换时不会丢失数据项,但这是一个很好的折衷方案。
  • 共享内存
  • 数据报套接字。
  • ETC...

最后两个很难用 shell 脚本来完成,但最后一个(数据报套接字)至少是可能的,如果使用像 Python 这样的编程语言,并且会变得更容易。

如果您愿意多花一点时间,并且具备一些基本的网络技能,例如使用 Python(或 Ruby 等)等语言,那么数据报套接字(UNIX 或 UDP)非常适合您。数据是短暂的,因此它不消耗内存,无需执行任何操作来安排生产者和消费者之间的通信设置(只需在正确的端口上发送和接收),因此当其中一个或另一个崩溃或获取时,无需管理错误重启,生产者和消费者甚至可以远程。唯一的缺点是,当使用应用程序未运行时,数据会进入位桶而不是进行缓冲。

同样,您选择什么解决方案将取决于您的应用程序。

答案2

一种选择是使用命名管道。您的应用程序可以写入命名管道,并且您可以以与当前正在执行的相同方式监视管道。您可能希望对管道进行非阻塞写入操作,以便在管道填满时不会阻塞程序执行。但请注意,这样您将丢失无法写入的数据。

有关创建命名管道的信息,请参阅“mkfifo”。您可以使用 mkfifo(3) 以编程方式执行此操作,也可以使用 mkfifo(1) 手动执行此操作。

相关内容