很想写些话在最前面,但是真的不知道该说什么好。 很快的,2005年已经过去,这几天一直打算要在2005年内再写几篇的,可惜,每次都是忙的要死,要不就是有别的事情,一直推倒2005年的最后一天晚上。 本来已经决定了一定要完成的,都怪湖南卫视台的那个跨年度演唱会啊,竟然一直到12点以后才结束,我又不舍的离开,没办法。 可见我就是这样一个人,对于已定的计划总是有理由去拖延 :) 回头看看,已经1个多月没有发帖子了,感觉很遗憾,就这样走完了2005年。这一年发生了很多事情,也有很多事情没有机会发生,更有很多事情没来得及发生,回首刚刚过去的年度,感慨良多啊……
回归正题吧,前些天正好需要完成一个实时分析linux系统CPU、内存使用情况的功能,类似于windows任务管理器的那种。当时搜了很多帖子出来,有些比较深刻,但是用Java调用起来比较麻烦,又要用jni、又要写C,在万般无奈之下翻阅了一些linux的相关资料,竟然得知linux系统中/proc/目录下有存放系统信息的文件,大喜过望啊! 在这个辞旧迎新的夜晚,记录下来,方便以后随时查阅,嘿嘿……
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;/** * 取得linux系统下的cpu、内存信息 * * <p>@author javer QQ:84831612</p> * @date 2005 */public final class LinuxSystemTool{ /** * get memory by used info * * @return int[] result * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree; * @throws IOException * @throws InterruptedException */ public static int[] getMemInfo() throws IOException, InterruptedException { File file = new File("/proc/meminfo"); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(file))); int[] result = new int[4]; String str = null; StringTokenizer token = null; while((str = br.readLine()) != null) { token = new StringTokenizer(str); if(!token.hasMoreTokens()) continue; str = token.nextToken(); if(!token.hasMoreTokens()) continue; if(str.equalsIgnoreCase("MemTotal:")) result[0] = Integer.parseInt(token.nextToken()); else if(str.equalsIgnoreCase("MemFree:")) result[1] = Integer.parseInt(token.nextToken()); else if(str.equalsIgnoreCase("SwapTotal:")) result[2] = Integer.parseInt(token.nextToken()); else if(str.equalsIgnoreCase("SwapFree:")) result[3] = Integer.parseInt(token.nextToken()); } return result; } /** * get memory by used info * * @return float efficiency * @throws IOException * @throws InterruptedException */ public static float getCpuInfo() throws IOException, InterruptedException { File file = new File("/proc/stat"); BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(file))); StringTokenizer token = new StringTokenizer(br.readLine()); token.nextToken(); int user1 = Integer.parseInt(token.nextToken()); int nice1 = Integer.parseInt(token.nextToken()); int sys1 = Integer.parseInt(token.nextToken()); int idle1 = Integer.parseInt(token.nextToken()); Thread.sleep(1000); br = new BufferedReader( new InputStreamReader(new FileInputStream(file))); token = new StringTokenizer(br.readLine()); token.nextToken(); int user2 = Integer.parseInt(token.nextToken()); int nice2 = Integer.parseInt(token.nextToken()); int sys2 = Integer.parseInt(token.nextToken()); int idle2 = Integer.parseInt(token.nextToken()); return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1)); }}
/** * 测试类 * * <p>@author javer QQ:84831612</p> * @date 2005 */public class JaverTest{ public static void main(String[] args) throws Exception { int[] memInfo = LinuxSystemTool.getMemInfo(); System.out.println("MemTotal:" + memInfo[0]); System.out.println("MemFree:" + memInfo[1]); System.out.println("SwapTotal:" + memInfo[2]); System.out.println("SwapFree:" + memInfo[3]); System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo()); }}
