2009-08-14 137 views
0

用户,管理员和技术支持人员需要从C.运行信息

开发了我的情况下,这些信息,例如一个守护进程运行时的细节和监测信息

  • 当前系统运行状况,如吞吐量(MB /秒),已经写入的数据,...
  • 当前配置

我会在Java世界中使用JMX和procfs的(或sysfs)接口的内核模块。日志文件似乎不是最好的方法。

C守护程序的这种信息接口的最佳方式是什么?

我想过打开套接字并实现一个裸机http或xmlrpc服务器,但这似乎是矫枉过正。什么是替代品?

+0

日志文件通常是最好的一阶解决方案。 – 2009-08-14 14:27:07

+0

共享内存怎么样? – philant 2009-08-14 15:52:53

回答

1

您可以在UNIX域套接字上侦听,并且定期写入连接到它的任何人的当前状态(例如每秒一次)。您不需要实现像HTTP或XMLRPC这样的协议 - 因为通信将是单向的,只需定期编写一行包含状态的纯文本。

1

如果您仍在使用关系数据库,请创建另一个表并根据需要填写当前状态。如果您没有关系数据库,请将该状态写入文件中,然后实施一些循环方案,以避免覆盖当前有人阅读的文件。

+2

使用RDBMS进行日志记录不是一个好主意 - 如何记录“数据库连接失败”?日志应该使用最简单,最不可能的失败机制。 – 2009-08-14 16:01:11

+0

我并不打算将它用于日志记录,也没有要求日志记录。相反,他想查询当前状态(不是历史状态)。我完全同意错误报告应该使用一个非常简单的机制 - 但我相信这不是问题。 – 2009-08-14 16:18:47

+0

好的,我也相信RDBMS是实时共享进程间信息的不好解决方案。让你的GUI(或其他)查​​询数据库的状态变化是一个糟糕的解决方案,恕我直言。 – 2009-08-14 16:46:27

0

写入文件。使用文件锁定协议强制原子读取和写入。你同意的任何事情都可以工作。可能会有一个UUCP锁定库浮在你可以使用的位置。在以前的生活中,我发现了一个Linux版本。我也从头开始实施它。这样做也相当微不足道。

查看Linux上的lockdev(3)库。它适用于设备,但它也可用于普通文件。

+0

您通常不需要对日志进行任何锁定。 – 2009-08-14 16:08:45

+0

我并不是建议OP使用日志文件。我正在考虑一个包含上述数据快照的小文件。该文件的大小是固定的,所有数据都在已知位置。因此,更新它需要某种形式的锁定以防止无效读取。 – 2009-08-14 17:30:25

4

你可以在你的守护进程中使用一个信号处理程序来对USR1做出反应,并将信息转储到屏幕/日志/网络。这样,只要您需要信息,您就可以发送过程USR1信号。

+0

+1。 SIGINFO是一个不错的选择。 – outis 2009-08-15 02:40:46

0

我最喜欢socket的想法。没有必要支持HTTP或任何RPC协议。您可以创建一个简单的特定于应用程序的协议来返回请求的信息如果服务器总是返回相同的信息,那么处理传入的请求是微不足道的,但如果您想要扩展可能的查询,那么简单的方法可能会导致问题。使用预先存在的协议的主要原因是利用现有的库和工具。

说到杠杆作用,另一种选择是使用SNMP并将守护程序作为托管组件访问。如果您需要远程查询/管理守护程序,则此选项有其优势,但否则可能会比HTTP服务器更有效。