Java Runtime.getRuntime().exec()执行linux脚本

Java Runtime.getRuntime().exec()执行linux脚本

相关文章链接:

linux系统配置(cpu、内存、磁盘等)

观前提示:

本文所使用的IDEA版本为ultimate 2019.1,JDK版本为1.8.0_141,Linux版本为CentOS release 6.10。

最近,在使用Java调用linux命令查询系统信息时发现,执行一些简单的脚步没有问题,但是稍微复杂的脚本变执行失败了。在百度了之后,发现加上

String[] cmd = new String[]{
    
    "sh","-c", command};

便可成功执行。

例子如下(部分代码)

/**
	 * @Title getCpuInfo
	 * @Description 获取CPU相关信息
	 * @date 2020-07-29 by jjy
	 * @return Map<String, Object>
	 */
	public static Map<String, Object> getCpuInfo() {
    
    

		log.info("Collect cpu info start...");
		Map<String, Object> resultMap = new LinkedHashMap<>();

		// 查询cpu信息
		String cpuNameCommand = "cat /proc/cpuinfo | grep name | cut -f2 -d: |uniq";
		// 查询cpu物理个数
		String physicalCommand = "cat /proc/cpuinfo| grep \"physical id\"| sort| uniq| wc -l";
		// 查看每个物理 CPU 中 core 的个数(即核数)
		String coreCommand =  "cat /proc/cpuinfo| grep \"cpu cores\"| uniq | cut -f2 -d:";
		// 查询cpu逻辑核数
		String logicCommand = "cat /proc/cpuinfo| grep \"processor\"| wc -l";
		// 查询cpu空闲率
		String idleCommand = "top -b -n 1 |grep Cpu | cut -d \",\" -f 4";

		Process pro = null;
		BufferedReader br = null;
		try{
    
    

			// 查询CPU信息
			String[] cmd = new String[]{
    
    "sh","-c", cpuNameCommand};
			pro = Runtime.getRuntime().exec(cmd);
			pro.waitFor();
			br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
			String cpuName = br.readLine().replaceAll("\\s+"," ");
			resultMap.put("name", cpuName);
			log.info("Cpu name: {}", cpuName);

			// 查询CPU物理核数
			cmd = new String[]{
    
    "sh","-c", physicalCommand};
			pro = Runtime.getRuntime().exec(cmd);
			pro.waitFor();
			br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
			String physicalNumber = br.readLine().trim();
			resultMap.put("package", physicalNumber + "个物理CPU");
			log.info("Cpu package: {}", physicalNumber);

			// 查询CPU物理核数
			cmd = new String[]{
    
    "sh","-c", coreCommand};
			pro = Runtime.getRuntime().exec(cmd);
			pro.waitFor();
			br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
			String physicalCore = br.readLine().trim();
			resultMap.put("core", physicalCore + "个物理核心");
			log.info("Cpu core: {}", physicalCore);

			// 查询CPU逻辑核数
			cmd = new String[]{
    
    "sh","-c", logicCommand};
			pro = Runtime.getRuntime().exec(cmd);
			pro.waitFor();
			br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
			String logic = br.readLine() + "个逻辑CPU ";
			resultMap.put("logic", logic);
			log.info("Cpu logic: {}", logic);

			// CPU总核数
			resultMap.put("coreNumber", Integer.parseInt(physicalNumber) * Integer.parseInt(physicalCore));
			log.info("Cpu core number: {}", Integer.parseInt(physicalNumber) * Integer.parseInt(physicalCore));

			// 计算CPU使用率
			cmd = new String[]{
    
    "sh","-c", idleCommand};
			pro = Runtime.getRuntime().exec(cmd);
			pro.waitFor();
			br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
			String idle = br.readLine().trim().replace("%id", "");
			Double idleUsage = Double.parseDouble(DF.format(Double.parseDouble(idle)));
			resultMap.put("idle", idleUsage);
			log.info("Cpu idle usage(%): {}", idleUsage);
			String usedUsage = DF.format((float) 100 - idleUsage);
			resultMap.put("used", usedUsage);
			log.info("Cpu used usage(%): {}", usedUsage);


			closeIoStream(br, pro);
		} catch (Exception e){
    
    
			log.error("Collect cpu info error...", e);
			return cpuErrorMap();
		} finally {
    
    
			closeIoStream(br, pro);
		}
		log.info("Collect cpu info success...");
		
		return resultMap;
	}
		
	/**
	 * @Title closeIoStream
	 * @Description 关闭IO流
	 * @date 2020-07-29 by jjy
	 * @param br BufferedReader
	 * @param pro Process
	 */
	private static void closeIoStream(BufferedReader br, Process pro){
    
    
		if(br != null) {
    
    
			try {
    
    
				br.close();
			} catch (IOException e) {
    
    
			}
		}
		if(pro != null) {
    
    
			pro.destroy();
		}
	}

日志输出如下

在这里插入图片描述

扫描二维码关注公众号,回复: 11858635 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_43611145/article/details/107860869
今日推荐