我正在开发一个项目,需要显示CPU使用率以及远程机器的其他系统信息。 人们建议使用SIGAR来实现这一点,但我不知道如何使用它。源代码对我来说不太合理。 基本上,我的问题是:当提供主机IP和JMX端口时,如何将SIGAR提供的MBean注册到服务器,以及如何从其他计算机获取系统信息。 如果我错了JMX的工作方式,请纠正我。提前致谢。如何使用SIGAR远程获取另一台机器的系统信息?
0
A
回答
0
在我看来,您将不得不编写一些包装对象来将各种SIGAR输出作为JMX mbean属性公开。你如何做到这一点很大程度上取决于你使用什么来公开你的JMX bean。我会为每种不同类型的SIGAR输出写入一个包装对象:内存,磁盘,...
我写了一个SimpleJMX library,可能有所帮助。我将使用它的格式来提供一个可用于通过JMX公开信息的示例对象。您可以根据您使用的任何机制来发布JMX方法。我对SIGAR不熟悉,不知道下面的我的sigar代码是否正确以获得ProcMem
实例。
@JmxResource(description = "Show SIGAR Info", domainName = "foo")
public class SigarProcMem {
private ProcMem procMem;
{
// sorry, I'm not up on sigar so I'm not sure if this works
Sigar sigar = new Sigar();
procMem = sigar.getProcMem(sigar.getPid());
}
@JmxAttributeMethod(description = "Resident memory")
public long residentMemory() {
return procMem.getResident();
}
@JmxAttributeMethod(description = "Get the Total process virtual memory")
public long totalVirtualMemory() {
return procMem.getSize();
}
}
0
这些是在SIGAR内置的,你可以注册的MBean类的名称:
- org.hyperic.sigar.jmx.SigarCpu
- org.hyperic.sigar。 jmx.SigarCpuInfo
- org.hyperic.sigar.jmx.SigarCpuPerc
- org.hyperic.sigar.jmx.SigarLoadAverage
- org.hyperic.sigar.jmx.SigarMem
- org.hyperic.sigar.jmx.SigarProcess
- org.hyperic.sigar.jmx.SigarRegistry
- org.hyperic.sigar.jmx.SigarSwap
然而,这将是相当复杂因为Sigar依赖于本地库,所以在MBean加载时,它必须位于目标JVM的lib路径中。这意味着,您需要在要监视的每个目标主机上主动加载库和MBean。
你也许可以通过远程调用来破解目标JVM加载它的方法,但它不是微不足道的,并且需要绕过JVM中的任何安全设置,因为默认情况下,不应该这样做。
0
可以排序的破解系统的一部分,以获得一个简单的部署Sigjar:
private String before;
private Sigar sigar;
/**
* Constructor - don't forget to call unload later!
*/
public SetlogSigar() throws Exception {
before = System.getProperty("java.library.path");
String path = "";
String add = getJarFolder();
if (before.contains(";"))
path = before + ";./;" + add;
else
path = before + ":./:" + add;
setSystemPath(path);
sigar = new Sigar();
}
/**
* This is needed to dynamically update the JAVA Path environment in order to load the needed native library
* Yes -rather an ugly hack...
*/
private String getJarFolder() {
// get name and path
String path = SetlogSigar.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = path;
try {
decodedPath = URLDecoder.decode(path, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
File f = new File(decodedPath);
String absolutePath = f.getParentFile().getParentFile().getParentFile().getParent()+"/lib";
return absolutePath;
}
/**
* Unloads the JNI bindings
*/
public void unload() {
this.sigar.close();
setSystemPath(before);
}
这种动态破解地方添加sigjar.jar位于环境变量的文件夹。只需将所有本地库放置在那里,部署变得更简单。
相关问题
- 1. 获取远程机器的系统信息(使用Java)
- 2. 如何获取远程机器的运行进程信息
- 3. Linux系统监视器如何获取进程统计信息
- 4. 如何远程连接到网络中的另一台Windows机器并从该机器获取操作系统信息? (Telnet除外)
- 5. 使用c获取系统信息#
- 6. 使用Reg Query获取系统信息
- 7. 使用Pyro4获取系统信息
- 8. 使用c获取系统信息#
- 9. 使用Hyperic获取Java系统进程列表SIGAR
- 10. 如何使用node.js获取系统统计信息
- 11. 如何从我的应用程序获取系统信息?
- 12. 使用SIGAR从Web应用服务器获取oracle进程信息(glassfish4)
- 13. 如何使用Java获取操作系统级别的信息?
- 14. 如何远程获取DNS信息?
- 15. 如何发送另一台机器的系统日志条目?
- 16. 如何获取远程计算机的操作系统版本
- 17. 如何使用纯qml linux获取系统,用户信息
- 18. 如何获取位置远程手机的详细信息
- 19. 在windows机器上获取pc(系统)信息 - C#脚本
- 20. 如何使用WCF获取远程系统进程列表
- 21. 用Postgresql获取系统操作信息
- 22. 如何使用Lotus脚本获取系统/磁盘信息?
- 23. 从网络上的远程机器获取* NIC信息?
- 24. 从另一台计算机获取信息
- 25. 使用PHP获取远程主机状态信息和详细信息
- 26. 的Qt - 获取系统信息
- 27. 如何获取一些系统硬件信息?
- 28. 如何使用AJAX获取远程文件信息?
- 29. 使用Java检索远程系统信息
- 30. 从一台linux机器到另一台linux机器的远程文件传输
漂亮的图书馆。我在那里工作了一个类似的图书馆。好奇你为什么要粉碎JmxOperation注释中的参数信息,而不是为参数提供单独的注释? – jtahlborn
@jtahlborn嘿。我只是讨厌那种复杂性。我总是要查找如何执行一系列注释字段或复制另一个实例。我没有足够的记忆。 :-) – Gray
我想你误会了我。我指的是有一个单独的注释,你把方法参数(没有数组涉及到)。我认为这比JmxOperation中的值数组简单得多。 – jtahlborn