杰瑞科技汇

java 获取 linux 信息

在Java中获取Linux系统信息

在Java中获取Linux系统信息可以通过多种方式实现,以下是几种常见的方法:

java 获取 linux 信息-图1
(图片来源网络,侵删)

使用Java内置类

import java.lang.management.*;
public class SystemInfo {
    public static void main(String[] args) {
        // 获取操作系统信息
        System.out.println("操作系统名称: " + System.getProperty("os.name"));
        System.out.println("操作系统版本: " + System.getProperty("os.version"));
        System.out.println("操作系统架构: " + System.getProperty("os.arch"));
        // 获取Java虚拟机信息
        System.out.println("Java版本: " + System.getProperty("java.version"));
        System.out.println("Java供应商: " + System.getProperty("java.vendor"));
        // 获取内存信息
        MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
        MemoryUsage heapUsage = memoryMXBean.getHeapMemoryUsage();
        System.out.println("JVM堆内存使用: " + heapUsage.getUsed() / 1024 / 1024 + "MB");
    }
}

使用Runtime执行系统命令

import java.io.*;
public class LinuxSystemInfo {
    public static void main(String[] args) {
        try {
            // 获取CPU信息
            Process process = Runtime.getRuntime().exec("cat /proc/cpuinfo");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            // 获取内存信息
            process = Runtime.getRuntime().exec("free -m");
            reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            // 获取磁盘信息
            process = Runtime.getRuntime().exec("df -h");
            reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用第三方库OSHI

OSHI是一个跨平台的Java系统信息库,可以轻松获取各种系统信息。

<!-- Maven依赖 -->
<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.4.0</version>
</dependency>
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;
public class OshiExample {
    public static void main(String[] args) {
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        OperatingSystem os = si.getOperatingSystem();
        // 操作系统信息
        System.out.println("操作系统: " + os.getFamily() + " " + os.getVersionInfo());
        // CPU信息
        CentralProcessor processor = hal.getProcessor();
        System.out.println("处理器: " + processor.getProcessorIdentifier().getName());
        System.out.println("逻辑处理器数: " + processor.getLogicalProcessorCount());
        System.out.println("物理处理器数: " + processor.getPhysicalProcessorCount());
        // 内存信息
        GlobalMemory memory = hal.getMemory();
        System.out.println("总内存: " + memory.getTotal() / 1024 / 1024 / 1024 + " GB");
        System.out.println("可用内存: " + memory.getAvailable() / 1024 / 1024 / 1024 + " GB");
        // 磁盘信息
        hal.getDiskStores().forEach(disk -> {
            System.out.println("磁盘: " + disk.getName() + 
                             ", 大小: " + disk.getSize() / 1024 / 1024 / 1024 + " GB");
        });
    }
}

使用SIGAR工具

SIGAR (System Information Gatherer And Reporter) 是另一个获取系统信息的工具,但需要额外的本地库。

// 需要下载sigar-bin.zip并解压,将sigar-amd64-linux.so等库放在java.library.path中
import org.hyperic.sigar.*;
public class SigarExample {
    public static void main(String[] args) throws SigarException {
        Sigar sigar = new Sigar();
        // CPU信息
        CpuPerc cpuList[] = sigar.getCpuPercList();
        for (int i = 0; i < cpuList.length; i++) {
            System.out.println("CPU " + i + ": " + cpuList[i].getCombined() * 100 + "%");
        }
        // 内存信息
        Mem mem = sigar.getMem();
        System.out.println("总内存: " + mem.getTotal() / 1024 / 1024 + " MB");
        System.out.println("使用内存: " + mem.getUsed() / 1024 / 1024 + " MB");
        System.out.println("空闲内存: " + mem.getFree() / 1024 / 1024 + " MB");
        // 磁盘信息
        FileSystem fslist[] = sigar.getFileSystemList();
        for (int i = 0; i < fslist.length; i++) {
            FileSystem fs = fslist[i];
            System.out.println("磁盘: " + fs.getDevName() + 
                             ", 挂载点: " + fs.getDirName() + 
                             ", 总大小: " + sigar.getFileSystemUsage(fs.getDirName()).getTotal() / 1024 / 1024 + " MB");
        }
    }
}

注意事项

  1. 使用Runtime执行系统命令需要谨慎,要注意命令注入风险
  2. 访问/proc文件系统是Linux特有的方法,在其他系统上不可用
  3. 使用第三方库如OSHI或SIGAR可以提供更全面和跨平台的解决方案
  4. 在生产环境中使用这些方法时,要考虑性能影响和权限问题

方法可以根据具体需求选择使用,OSHI通常是现代Java应用获取系统信息的最佳选择。

java 获取 linux 信息-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇