我有一个c应用程序,它通过wmi从远程windows机器收集数据(cpu、ram、hdd用法等)。但现在我还需要监视几个linux操作系统。有没有办法从运行在windows box上的c app至少获得linux机器的cpu和ram利用率?
最佳答案
我设法从Linux Box获得了度量统计信息。因此,正如VirtualBlackFox
所提到的-标准化的方法是为此目的使用snmp。
第一步是在Linux上安装SNMP。(我在虚拟机上安装了ubuntu 12)
下面是我用来安装snmpone和two的链接。
基本上,您需要安装snmp守护进程并配置以公开度量和网络可见性。
我认为在这一步中,您可以使用一些snmp库从snmp设备获取数据,但我也尝试使用WMI-SNMP
网桥。
第二步:设置wmi-snmp环境
这是您需要执行的list步骤。
对我来说
在Windows功能中启用SNMP功能
在snmp
中创建%windir%\system32\wbem\
文件夹
使用此命令从mib文件生成mof文件
将snmp mof文件添加到wmi存储库Smi2smir /g ..\..\hostmib.mib > hostmib.mof
在这之后,我可以看到wmi类和属性
代码示例
使用sharpsnmplib
using Lextm.SharpSnmpLib;
using Lextm.SharpSnmpLib.Messaging;
var result = Messenger.Get(
VersionCode.V1,
new IPEndPoint(IPAddress.Parse("172.10.206.108"), 161),
new OctetString("public"),
new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.4.1.2021.4.6.0")) },
60000);
这一个将返回在盒子上使用的总内存。(顺便说一下,SNMP的标准端口是161)
使用snmp wmi网桥
string snmpClass = "SNMP_RFC1213_MIB_system";
string path = string.Format("\\\\.\\root\\snmp\\localhost:{0}=@", snmpClass);
var contextParams = new ManagementNamedValueCollection
{
{"AgentAddress", "172.10.206.108"}, // ip address of snmp device
{"AgentReadCommunity", "public"}
};
var options = new ObjectGetOptions(contextParams);
var objSys = new ManagementObject(new ManagementPath(path), options);
Console.WriteLine(objSys.Properties["sysDescr"].Value);
Console.ReadLine();
因此,至少有两种获取SNMP数据的方法:
使用oid(对象标识符唯一地标识mib层次结构中已损坏的对象),如我在第一个示例中所示。here是有用的链接。也可以在.mof文件中找到oid。
使用wmi-snmp网桥。所以我在第二个例子中使用了类似的路径,如果它对您不起作用,我想您可以在wmi资源管理器中找到正确的路径。
所以这就差不多了。不知道哪种方法更好或更快。都会试试看,哪个更适合我的目的。
关于c# - 如何从C#应用程序获取远程Linux机器的cpu和ram使用情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19952198/