如果我们想要获取服务器的一些基本信息,我们需要如何操作呢?
在java中,我们可以使用sigar来进行实现,sigar能够实现获取服务器运行时的各项状态信息,如:cpu占用率、内存使用情况等
话不多说,首先我们需要下载包,我理解这个应该是服务器的探针,可以基于java来进行获取;
本次使用的是hyperic-sigar-1.6.4.zip;如果需要下载的可以看文末进行获取;
当然,这个也是需要分64,32和windos,liunx的,不同的类型需要的文件的不同;
下载之后进行解压,windows将加压后的(路径为:D:\project\sigar\hyperic-sigar-1.6.4\sigar-bin\lib)下的:
sigar-amd64-winnt.dll或者sigar-x86-winnt.dll上传到:C:\Windows\System32
linux的将libsigar-x86-linux.so或者libsigar-amd64-linux.so上传到 cd /usr/lib中
不清楚自己的机器类型的话可以都上传上去
接下来进行java的开发
pom文件引入:
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
</dependency>
开发工具类
import org.hyperic.sigar.*;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class SysInfo {
// 1.CPU资源信息
// a)CPU数量(单位:个)
public int getCpuCount() throws SigarException {
Sigar sigar = new Sigar();
try {
return sigar.getCpuInfoList().length;
} finally {
sigar.close();
}
} // b)CPU的总量(单位:HZ)及CPU的相关信息
public List<Map<String, Object>> getCpuTotal() {
Sigar sigar = new Sigar();
CpuInfo[] infos;
List<Map<String, Object>> result = new ArrayList<>();
try {
infos = sigar.getCpuInfoList();
for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
CpuInfo info = infos[i];
Map<String, Object> map = new HashMap<>(16);
map.put("CPU的总量MHz", info.getMhz());
map.put("获得CPU的卖主", info.getVendor());
map.put("获得CPU的类别", info.getModel());
map.put("缓冲存储器数量", info.getCacheSize());
result.add(map);
}
} catch (SigarException e) {
e.printStackTrace();
}
return result;
} // c)CPU的用户使用量、系统使用剩余量、总的剩余量、总的使用占用量等(单位:100%)
public List<Map<String, Object>> testCpuPerc() {
Sigar sigar = new Sigar();
// 方式一,主要是针对一块CPU的情况
CpuPerc cpu;
List<Map<String, Object>> result = new ArrayList<>();
// 方式二,不管是单块CPU还是多CPU都适用
CpuPerc cpuList[] = null;
try {
cpuList = sigar.getCpuPercList();
} catch (SigarException e) {
e.printStackTrace();
}
for (int i = 0; i < cpuList.length; i++) {
Map<String, Object> map = new HashMap<>(16);
map.put("用户使用率", CpuPerc.format(cpuList[i].getUser()));
map.put("系统使用率", CpuPerc.format(cpuList[i].getSys()));
map.put("当前等待率", CpuPerc.format(cpuList[i].getWait()));
map.put("getNice", CpuPerc.format(cpuList[i].getNice()));
map.put("当前空闲率", CpuPerc.format(cpuList[i].getIdle()));
map.put("总的使用率", CpuPerc.format(cpuList[i].getCombined()));
result.add(map);
}
return result;
}
public Map<String, Object> getPhysicalMemory() {
// a)物理内存信息
Sigar sigar = new Sigar();
Mem mem;
Map<String, Object> map = new HashMap<>(16);
try {
mem = sigar.getMem();
// 内存总量
map.put("内存总量", mem.getTotal() / 1024L + "K av");
// 当前内存使用量
// 当前内存剩余量
map.put("当前内存剩余量", mem.getFree() / 1024L + "K free");
// b)系统页面文件交换区信息
Swap swap = sigar.getSwap();
// 交换区总量
map.put("交换区总量", swap.getTotal() / 1024L + "K av");
// 当前交换区使用量
map.put("当前交换区使用量", swap.getUsed() / 1024L + "K used");
// 当前交换区剩余量
map.put("当前交换区剩余量", swap.getFree() / 1024L + "K free");
} catch (SigarException e) {
e.printStackTrace();
}
return map;
}
// 3.操作系统信息
// a)取到当前操作系统的名称:
public String getPlatformName() {
String hostname = "";
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (Exception exc) {
Sigar sigar = new Sigar();
try {
hostname = sigar.getNetInfo().getHostName();
} catch (SigarException e) {
hostname = "localhost.unknown";
} finally {
sigar.close();
}
}
return hostname;
} // b)取当前操作系统的信息
public Map<String, Object> testGetOSInfo() {
OperatingSystem OS = OperatingSystem.getInstance();
// 操作系统内核类型如: 386、486、586等x86
Map<String, Object> result = new HashMap<>();
Map<String, Object> subtype = new HashMap<>();
subtype.put("OS.getArch()", OS.getArch());
subtype.put("OS.getCpuEndian()", OS.getCpuEndian());
subtype.put("OS.getDataModel()", OS.getDataModel());
subtype.put("OS.getCpuEndian()", OS.getCpuEndian());
subtype.put("OS.getDataModel()", OS.getDataModel());
result.put("操作系统内核类型", subtype);
// 系统描述
Map<String, Object> subdesc = new HashMap<>();
subdesc.put("OS.getDescription()", OS.getDescription());
subdesc.put("OS.getMachine()", OS.getMachine());
result.put("系统描述", subdesc);
Map<String, Object> subtype1 = new HashMap<>();
subtype1.put("OS.getName()", OS.getName());
subtype1.put("OS.getPatchLevel()", OS.getPatchLevel());
result.put("操作系统类型", subtype1);
// 操作系统类型
// 操作系统的卖主
result.put("操作系统的卖主", OS.getVendor());
// 卖主名称
result.put("卖主名称", OS.getVendorCodeName());
// 操作系统名称
result.put("操作系统名称", OS.getVendorName());
// 操作系统卖主类型
result.put("操作系统卖主类型", OS.getVendorVersion());
// 操作系统的版本号
result.put("操作系统的版本号", OS.getVersion());
return result;
}
// c)取当前系统进程表中的用户信息
public List<Object> testWho() {
List<Object> result = new ArrayList<>();
try {
Sigar sigar = new Sigar();
org.hyperic.sigar.Who[] who = sigar.getWhoList();
if (who != null && who.length > 0) {
for (int i = 0; i < who.length; i++) {
Map<String, Object> subtype = new HashMap<>();
System.out.println("\n~~~~~~~~~" + String.valueOf(i) + "~~~~~~~~~");
org.hyperic.sigar.Who _who = who[i];
subtype.put("getDevice", _who.getDevice());
subtype.put("getHost", _who.getHost());
subtype.put("getTime", _who.getTime());
subtype.put("getUser", _who.getUser());
// 当前系统进程表中的用户名
result.add(subtype);
}
}
} catch (SigarException e) {
e.printStackTrace();
}
return result;
}
}
控制层进行调用
@Autowired
private SysInfo sysInfo;
@ResponseBody
@RequestMapping("5")
public Map<String, Object> test5() throws SigarException {
Map<String, Object> result = new HashMap<>();
result.put("CPU数量", sysInfo.getCpuCount());
result.put("CPU的相关信息(单位HZ)", sysInfo.getCpuTotal());
result.put("CPU的用户使用量(单位100%)", sysInfo.testCpuPerc());
result.put("物理内存信息", sysInfo.getPhysicalMemory());
result.put("操作系统名称", sysInfo.getPlatformName());
result.put("取当前操作系统的信息", sysInfo.testGetOSInfo());
result.put(" 取当前系统进程表中的用户信息", sysInfo.testWho());
return result;
}
相应结果
这样就可以获取到该服务器的基本的信息
延伸:如果想做一些自己的服务器的监控,又不想用开源的一些信息,可以使用sigar来进行开发;当然,这个也可以进行进一步的优化:
(1)开发成可视化界面
(2)信息进行持久化
(3)探针文件自动上传不同的服务器
后面有时间将继续优化功能。