content: package org.apache.solr.handler.admin;
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.InputStreamReader;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  /**
   * linux 下cpu 内存 磁盘 jvm的使用监控
   * 
   * @author peng,.chen
   * 
   */
  public class LinuxOsInfo {
  	
  	/**
  	 * group1:use cpu used(%) <br>
  	 * group2:system cpu used(%)
  	 */
  	static final String cpuRegex = "Cpu\\(s\\):\\s+(\\d+\\.\\d+)%us,\\s+(\\d+\\.\\d+)%sy.*";
  	public static final Pattern cpuPattern = Pattern.compile(cpuRegex);
  	/**
  	 * group1: total mem(K)<br>
  	 * group2: used mem(K)<br>
  	 * group3: free mem(K)<br>
  	 */
  	static final String memRegex = "Mem:\\s+(\\d+)k\\s+total,\\s+(\\d+)k\\s+used,\\s+(\\d+)k\\s+free,.*";
  	public static final Pattern memPattern = Pattern.compile(memRegex);
  	public static LinuxOsInfo INSTANCE = null;
  	/**
  	 * 
  	 * @creation 2012-1-16 下午12:03:15
  	 * @return
  	 */
  	public static LinuxOsInfo getInstance(){
  		if(INSTANCE == null){
  			return new LinuxOsInfo();
  		}
  		return INSTANCE;
  	}
  	
  	private LinuxOsInfo() {
  	}
  	
  	/**
  	 * 
  	 * @creation 2012-1-16 下午12:55:07
  	 */
  	public static Info getInfo(){
  		Info info = new Info();
  		double[] cpuData = new double[]{0, 0};
  		try {
  			cpuData = getInstance().getCpuData();
  		} catch (Exception e) {
  		}
  		info.setCpuUsed(cpuData[0]);
  		double diskFree = getInstance().getDiskFree();
  		info.setDiskFree(diskFree);
  		double diskTotal = getInstance().getDiskTotal();
  		info.setDiskTotal(diskTotal);
  		double[] memData = new double[]{0, 0, 0};
  		try {
  			memData = getInstance().getMemData();
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  		info.setMemUsed(memData[1]);
  		info.setMemTotal(memData[0]);
  		info.setPath(new File("/").getAbsolutePath());
  		return info;
  	}
  	
  	/**
  	 * 获取cpu使用情况, 返回double数组{usCpu, syCpu}
  	 * 
  	 * @return
  	 * @throws Exception
  	 */
  	public double[] getCpuData() throws Exception {
  		double[] data = null;
  		if(!isLinuxOs()){
  			return new double[0];
  		}
  		Runtime rt = Runtime.getRuntime();
  		Process p = rt.exec("top -b -n 1");// 调用系统的“top"命令
  
  		BufferedReader in = null;
  		try {
  			in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  			String str = null;
  
  			while ((str = in.readLine()) != null) {
  				Matcher matcher = cpuPattern.matcher(str);
  				if(matcher.find()){
  					String usCpu = matcher.group(1);
  					String syCpu = matcher.group(2);
  					data = new double[]{Double.parseDouble(usCpu), Double.parseDouble(syCpu)};
  					break;
  				}
  			}
  		} catch (Exception e) {
  			e.printStackTrace();
  		} finally {
  			in.close();
  		}
  		return data;
  	}
  
  	/**
  	 * 内存监控, 返回double数组{totalMem, usedMem, freeMem}
  	 * 
  	 * @return
  	 * @throws Exception
  	 */
  	public double[] getMemData() throws Exception {
  
  		double[] data = null;
  		if(!isLinuxOs()){
  			return new double[0];
  		}
  		Runtime rt = Runtime.getRuntime();
  		Process p = rt.exec("top -b -n 1");// 调用系统的“top"命令
  
  		BufferedReader in = null;
  		try {
  			in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  			String str = null;
  
  			while ((str = in.readLine()) != null) {
  				Matcher matcher = memPattern.matcher(str);
  				if(matcher.find()){
  					String totalMem = matcher.group(1);
  					String usedMem = matcher.group(2);
  					String freeMem = matcher.group(3);
  					data = new double[]{Double.parseDouble(totalMem), Double.parseDouble(usedMem), Double.parseDouble(freeMem)};
  //					System.out.println("totalMem:"+totalMem+", usedMem:"+usedMem+", freeMem:"+freeMem);
  					break;
  				}
  			}
  		} catch (Exception e) {
  			e.printStackTrace();
  		} finally {
  			in.close();
  		}
  		return data;
  	}
  
  	/**
  	 * 获得当前磁盘总容量
  	 * @creation 2012-1-16 下午12:06:22
  	 * @return
  	 */
  	public double getDiskTotal(){
  		return new File("/").getTotalSpace();
  	}
  	
  	/**
  	 * 获得剩余空间容量
  	 * @creation 2012-1-16 下午12:06:54
  	 * @return
  	 */
  	public double getDiskFree(){
  		return new File("/").getFreeSpace();
  	}
  	
  	/**
  	 * 获取磁盘空间大小
  	 * 
  	 * @return
  	 * @throws Exception
  	 */
  	public double getDeskUsage() throws Exception {
  		double totalHD = 0;
  		double usedHD = 0;
  		Runtime rt = Runtime.getRuntime();
  		Process p = rt.exec("df -hl");// df -hl 查看硬盘空间
  
  		BufferedReader in = null;
  		try {
  			in = new BufferedReader(new InputStreamReader(p.getInputStream()));
  			String str = null;
  			String[] strArray = null;
  			int flag = 0;
  			while ((str = in.readLine()) != null) {
  				int m = 0;
  				// if (flag > 0) {
  				// flag++;
  				strArray = str.split(" ");
  				for (String tmp : strArray) {
  					if (tmp.trim().length() == 0)
  						continue;
  					++m;
  					// System.out.println("----tmp----" + tmp);
  					if (tmp.indexOf("G") != -1) {
  						if (m == 2) {
  							// System.out.println("---G----" + tmp);
  							if (!tmp.equals("") && !tmp.equals("0"))
  								totalHD += Double.parseDouble(tmp.substring(0,
  										tmp.length() - 1)) * 1024;
  
  						}
  						if (m == 3) {
  							// System.out.println("---G----" + tmp);
  							if (!tmp.equals("none") && !tmp.equals("0"))
  								usedHD += Double.parseDouble(tmp.substring(0,
  										tmp.length() - 1)) * 1024;
  
  						}
  					}
  					if (tmp.indexOf("M") != -1) {
  						if (m == 2) {
  							// System.out.println("---M---" + tmp);
  							if (!tmp.equals("") && !tmp.equals("0"))
  								totalHD += Double.parseDouble(tmp.substring(0,
  										tmp.length() - 1));
  
  						}
  						if (m == 3) {
  							// System.out.println("---M---" + tmp);
  							if (!tmp.equals("none") && !tmp.equals("0"))
  								usedHD += Double.parseDouble(tmp.substring(0,
  										tmp.length() - 1));
  							// System.out.println("----3----" + usedHD);
  						}
  					}
  
  				}
  
  				// }
  			}
  		} catch (Exception e) {
  			e.printStackTrace();
  		} finally {
  			in.close();
  		}
  		return (usedHD / totalHD) * 100;
  	}
  	
  	/**
  	 * 是否是linux OS
  	 * @creation 2012-5-11 下午5:01:19
  	 * @return
  	 */
  	public boolean isLinuxOs(){
  		String os = System.getProperty("os.name");
  		if(os.contains("Linux")){
  			return true;
  		}
  		return false;
  	}
  
  	/**
  	 * 
  	 * @creation 2012-1-16 下午12:04:21
  	 * @param args
  	 */
  	public static void main1(String[] args){
  		System.out.println(Runtime.getRuntime().maxMemory());;//Returns the maximum amount of memory that the Java virtual machine will attempt to use. 
  		System.out.println(Runtime.getRuntime().totalMemory());;//Returns the total amount of memory in the Java virtual machine.
  		System.out.println(Runtime.getRuntime().freeMemory());//Returns the amount of free memory in the Java Virtual Machine.
  		System.out.println(Runtime.getRuntime().availableProcessors());
  //		Runtime.getRuntime().removeShutdownHook(hook);
  //		Runtime.getRuntime().addShutdownHook(hook)
  	}
  	
  	public static void main2(String[] args) throws Exception {
  		LinuxOsInfo cpu = new LinuxOsInfo();
  //		System.out.println("---------------cpu used:" + cpu.getCpuUsage() + "%");
  //		System.out.println("---------------mem used:" + cpu.getMemUsage() + "%");
  //		System.out.println("---------------HD used:" + cpu.getDeskUsage() + "%");
  		System.out.println("---------------disk free:" + cpu.getDiskFree());
  		System.out.println("---------------disk total:" + cpu.getDiskTotal());
  		System.out.println("------------jvm监控----------------------");
  		Runtime lRuntime = Runtime.getRuntime();
  		System.out.println("--------------Free Momery:" + lRuntime.freeMemory() + "K");
  		System.out.println("--------------Max Momery:" + lRuntime.maxMemory() + "K");
  		System.out.println("--------------Total Momery:" + lRuntime.totalMemory() + "K");
  		System.out.println("---------------Available Processors :" + lRuntime.availableProcessors());
  	}
  	
  	public static void main(String[] args) {
  		Info info = LinuxOsInfo.getInfo();
  		System.out.println("cpuUsed : "+info.getCpuUsed());
  		System.out.println("diskFree : "+info.getDiskFree());
  		System.out.println("diskTotal : "+info.getDiskTotal());
  		System.out.println("memTotal : "+info.getMemTotal());
  		System.out.println("memUsed : "+info.getMemUsed());
  		System.out.println("currentPath : "+info.getPath());
  		System.out.println();
  	}
  	
  	
  	
  	
  }
  
  