package com.docus.server; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import oshi.SystemInfo; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.hardware.NetworkIF; import oshi.software.os.FileSystem; import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.Util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.DecimalFormat; import java.util.Formatter; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Properties; import java.util.StringTokenizer; /** * 系统消息工具类 **/ public class SystemInfoUtils { private static final int OSHI_WAIT_SECOND = 1000; private static final int SLEEP_TIME = 2 * 1000; private static SystemInfo systemInfo = new SystemInfo(); private static HardwareAbstractionLayer hardware = systemInfo.getHardware(); private static OperatingSystem operatingSystem = systemInfo.getOperatingSystem(); public static void main(String[] args) throws Exception { JSONObject info = getInfo(); System.out.println(info); } public static JSONObject getCpuInfo() { JSONObject cpuInfo = new JSONObject(); CentralProcessor processor = hardware.getProcessor(); // CPU信息 long[] prevTicks = processor.getSystemCpuLoadTicks(); Util.sleep(OSHI_WAIT_SECOND); long[] ticks = processor.getSystemCpuLoadTicks(); long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; //cpu核数 cpuInfo.put("cpuNum", processor.getLogicalProcessorCount()); //cpu系统使用率 cpuInfo.put("cSys", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu)); //cpu用户使用率 cpuInfo.put("user", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu)); //cpu当前等待率 cpuInfo.put("iowait", new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu)); //cpu当前使用率 cpuInfo.put("idle", new DecimalFormat("#.##%").format(1.0 - (idle * 1.0 / totalCpu))); return cpuInfo; } /** * 系统jvm信息 */ public static JSONObject getJvmInfo() { JSONObject cpuInfo = new JSONObject(); Properties props = System.getProperties(); Runtime runtime = Runtime.getRuntime(); long jvmTotalMemoryByte = runtime.totalMemory(); long freeMemoryByte = runtime.freeMemory(); //jvm总内存 cpuInfo.put("total", formatByte(runtime.totalMemory())); //空闲空间 cpuInfo.put("free", formatByte(runtime.freeMemory())); //jvm最大可申请 cpuInfo.put("max", formatByte(runtime.maxMemory())); //vm已使用内存 cpuInfo.put("user", formatByte(jvmTotalMemoryByte - freeMemoryByte)); //jvm内存使用率 cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte)); //jdk版本 cpuInfo.put("jdkVersion", props.getProperty("java.version")); //jdk路径 cpuInfo.put("jdkHome", props.getProperty("java.home")); return cpuInfo; } /** * 系统内存信息 */ public static JSONObject getMemInfo() { JSONObject cpuInfo = new JSONObject(); GlobalMemory memory = systemInfo.getHardware().getMemory(); //总内存 long totalByte = memory.getTotal(); //剩余 long acaliableByte = memory.getAvailable(); //总内存 cpuInfo.put("total", formatByte(totalByte)); //使用 cpuInfo.put("used", formatByte(totalByte - acaliableByte)); //剩余内存 cpuInfo.put("free", formatByte(acaliableByte)); //使用率 cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((totalByte - acaliableByte) * 1.0 / totalByte)); return cpuInfo; } /** * 带宽 */ public static JSONArray networkIFs() throws Exception { JSONObject cpuInfo; JSONArray sysFiles = new JSONArray(); List networkIFs = systemInfo.getHardware().getNetworkIFs(); for (NetworkIF networkIF : networkIFs) { String name = networkIF.getName(); long receiveBytes = networkIF.getBytesRecv(); long transmitBytes = networkIF.getBytesSent(); cpuInfo = new JSONObject(); //名称 cpuInfo.put("name", name); //网络接收 cpuInfo.put("receiveBytes", formatNumber(receiveBytes / (1024.0 * (2 * 1000 / 1000)))); //网络发送 cpuInfo.put("transmitBytes", formatNumber(transmitBytes / (1024.0 * (2 * 1000 / 1000)))); sysFiles.add(cpuInfo); } return sysFiles; } public static JSONObject getNetWork() { JSONObject networkInfo = new JSONObject(); Properties props = System.getProperties(); String os = props.getProperty("os.name").toLowerCase(); os = os.startsWith("win") ? "windows" : "linux"; Map result = new HashMap<>(); Process pro = null; Runtime r = Runtime.getRuntime(); BufferedReader input = null; try { String command = "windows".equals(os) ? "netstat -e" : "ifconfig"; pro = r.exec(command); input = new BufferedReader(new InputStreamReader(pro.getInputStream())); long result1[] = readInLine(input, os); Thread.sleep(SLEEP_TIME); pro.destroy(); input.close(); pro = r.exec(command); input = new BufferedReader(new InputStreamReader(pro.getInputStream())); long result2[] = readInLine(input, os); String rxPercent = formatNumber((result2[0] - result1[0]) / (1024.0 * (SLEEP_TIME / 1000)));// 下行速率(kB/s) String txPercent = formatNumber((result2[1] - result1[1]) / (1024.0 * (SLEEP_TIME / 1000)));// 上行速率(kB/s) networkInfo.put("rxPercent", rxPercent); networkInfo.put("txPercent", txPercent); } catch (Exception e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } Optional.ofNullable(pro).ifPresent(p -> p.destroy()); } return networkInfo; } private static long[] readInLine(BufferedReader input, String osType) { long arr[] = new long[2]; StringTokenizer tokenStat = null; try { if (osType.equals("linux")) { // 获取linux环境下的网口上下行速率 long rx = 0, tx = 0; String line = null; //RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0 //TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0 while ((line = input.readLine()) != null) { if (line.indexOf("RX packets") >= 0) { rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", line.indexOf("RX packets") + 11))); } else if (line.indexOf("TX packets") >= 0) { tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", line.indexOf("TX packets") + 11))); } } arr[0] = rx; arr[1] = tx; } else { // 获取windows环境下的网口上下行速率 input.readLine(); input.readLine(); input.readLine(); input.readLine(); tokenStat = new StringTokenizer(input.readLine()); tokenStat.nextToken(); arr[0] = Long.parseLong(tokenStat.nextToken()); arr[1] = Long.parseLong(tokenStat.nextToken()); } } catch (Exception e) { e.printStackTrace(); } return arr; } private static String formatNumber(double f) { return new Formatter().format("%.2f", f).toString(); } /** * 系统盘符信息 */ public static JSONArray getSysFileInfo() { JSONObject cpuInfo; JSONArray sysFiles = new JSONArray(); FileSystem fileSystem = operatingSystem.getFileSystem(); List fsArray = fileSystem.getFileStores(); for (OSFileStore fs : fsArray) { cpuInfo = new JSONObject(); //盘符路径 cpuInfo.put("dirName", fs.getMount()); //盘符类型 cpuInfo.put("sysTypeName", fs.getType()); //文件类型 cpuInfo.put("typeName", fs.getName()); //总大小 cpuInfo.put("total", formatByte(fs.getTotalSpace())); //剩余大小 cpuInfo.put("free", formatByte(fs.getUsableSpace())); //已经使用量 cpuInfo.put("used", formatByte(fs.getTotalSpace() - fs.getUsableSpace())); if (fs.getTotalSpace() == 0) { //资源的使用率 cpuInfo.put("usage", 0); } else { cpuInfo.put("usage", new DecimalFormat("#.##%").format((fs.getTotalSpace() - fs.getUsableSpace()) * 1.0 / fs.getTotalSpace())); } sysFiles.add(cpuInfo); } return sysFiles; } /** * 系统信息 */ public static JSONObject getSysInfo() throws UnknownHostException { JSONObject cpuInfo = new JSONObject(); Properties props = System.getProperties(); //操作系统名 cpuInfo.put("osName", props.getProperty("os.name")); //系统架构 cpuInfo.put("osArch", props.getProperty("os.arch")); //服务器名称 cpuInfo.put("computerName", InetAddress.getLocalHost().getHostName()); //服务器Ip cpuInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress()); //项目路径 cpuInfo.put("userDir", props.getProperty("user.dir")); return cpuInfo; } /** * 所有系统信息 */ public static JSONObject getInfo() throws Exception { JSONObject info = new JSONObject(); info.put("cpuInfo", getCpuInfo()); info.put("jvmInfo", getJvmInfo()); info.put("memInfo", getMemInfo()); info.put("sysInfo", getSysInfo()); info.put("sysFileInfo", getSysFileInfo()); info.put("networkInfo", getNetWork()); return info; } /** * 单位转换 */ private static String formatByte(long byteNumber) { //换算单位 double FORMAT = 1024.0; double kbNumber = byteNumber / FORMAT; if (kbNumber < FORMAT) { return new DecimalFormat("#.##KB").format(kbNumber); } double mbNumber = kbNumber / FORMAT; if (mbNumber < FORMAT) { return new DecimalFormat("#.##MB").format(mbNumber); } double gbNumber = mbNumber / FORMAT; if (gbNumber < FORMAT) { return new DecimalFormat("#.##GB").format(gbNumber); } double tbNumber = gbNumber / FORMAT; return new DecimalFormat("#.##TB").format(tbNumber); } }