【Java實用工具】——使用oshi獲取主機信息


最近在籌划做一個監控系統。其中就要獲取主機信息,其中遇到一些問題。在此做個記錄,以便以后查閱。

在該監控系統中,想要做到主機的CPU、內存、磁盤、網絡、線程、JVM內存、JVM GC 等維度的監控,JVM方面的監控還好說,直接用JMX做就行了,關鍵是主機信息不好做監控,JDK沒有直接的方案獲取系統主機信息。在剛開始想到了以下幾種方式獲取主機維度的信息。

一、命令行

剛開始想的是用最常用的命令行獲取主機維度的信息,具體做法是針對不同的系統,寫不同的命令。比如說Linux系統,使用TOP命令就能獲取到CPU、內存等方面的信息。

top -b -n 1

執行該TOP命令就能獲取到CPU、內存等維度的信息

Tasks: 515 total,   1 running, 511 sleeping,   3 stopped,   0 zombie 
Cpu(s): 14.5%us,  5.3%sy,  0.0%ni, 77.0%id,  0.8%wa,  0.0%hi,  2.4%si,  0.0%st
Mem:  65779104k total, 62037048k used,  3742056k free,   425804k buffers
Swap:        0k total,        0k used,        0k free, 21948492k cached

這種方式雖然好,但是需要針對不同系統做兼容。為了將懶字發揮到極致於是我就開始尋找現有的開源組件。然后找到了一個sigar的東西,貌似這個在業界內應用還挺廣的。

二、sigar

sigar的api用起來也挺方便的,簡單且使用人數多。

/ CPU數量(單位:個) 
int cpuLength = sigar.getCpuInfoList().length; 
print(cpuLength); 
   
// CPU的總量(單位:HZ)及CPU的相關信息 
CpuInfo infos[] = sigar.getCpuInfoList(); 
for (int i = 0; i < infos.length; i++) {// 不管是單塊CPU還是多CPU都適用 
    CpuInfo info = infos[i]; 
    print("mhz=" + info.getMhz());// CPU的總量MHz 
    print("vendor=" + info.getVendor());// 獲得CPU的賣主,如:Intel 
    print("model=" + info.getModel());// 獲得CPU的類別,如:Celeron 
    print("cache size=" + info.getCacheSize());// 緩沖存儲器數量 
}

但是,sigar需要根據不同的系統下載不同的庫文件,傾入性較高。

sigar 庫文件
windows平台:sigar-x86-winnt.dll
linux平台:libsigar-x86-linux.so或
solaris平台: libsigar-x86-solaris.so或libsigar-sparc-solaris.so或libsigar-sparc64-solaris.so
64位平台:分為至強的libsigar-ia64-linux.so和AMD的libsigar-amd64-linux.so,sigar-amd64-winnt.dll

這樣就讓我很為難了,於是繼續在網上尋找。終於找到了oshi。

三、oshi

看看oshi是怎么獲取系統信息的吧

首先,引入jar包

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>${oshi.version}</version>
</dependency>

然后,開擼

// 獲取主機信息
SystemInfo systemInfo = new SystemInfo();
// 獲取操作系統信息
OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
operatingSystem.getNetworkParams().getHostName();
operatingSystem.getFamily();
operatingSystem.getVersion().getVersion();
operatingSystem.getVersion().getBuildNumber();
operatingSystem.getBitness();
operatingSystem.getProcessCount();
operatingSystem.getThreadCount();

就是這么簡單,不需要不同系統引入不同的庫文件,也不用自己做系統兼容。oshi自己做了兼容,目前大概兼容些這些系統: Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX。

四、對比

以上幾種方式,大概可以做個這樣的總結:

  • 命令行:靈活度高,兼容性強,但是如果要兼容多個平台的話,自己做還是有些麻煩。
  • sigar:社區活躍度高,參考文檔全面,麻煩在於需要不同平台引入不同的庫文件。
  • oshi:拿來主義,使用方便,缺點在於文檔少。不過個人認為看看github上的文檔就夠了,使用過程也沒有什么坑。

綜上,因為我個人在開發的時候選擇的是oshi。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM