一 关于JConsole
1.设置远程机器的用户名和密码
进入$JAVA_HOME/jre/lib/management下面
[root@larbeeze monitor]# echo $JAVA_HOME /usr/local/java/jdk1.8.0_25/ [root@larbeeze monitor]# cd /usr/local/java/jdk1.8.0_25/jre/lib/management [root@larbeeze management]# ls jmxremote.access jmxremote.password.template management.properties snmp.acl.template [root@larbeeze management]# cp jmxremote.password.template jmxremote.password [root@larbeeze management]# vi jmxremote.password
可以看到文件的最下面的两个用户被注释掉了,可以启用下面任意一个用户,只是权限不同而已。
可以通过[root@larbeeze management]# vi jmxremote.access 命令来查看这两个用户的权限
2. 开始启动java进程啦 While类只是输出一次休眠1s
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremo.ssl=false While
报错了,这个是权限问题,这个文件权限不能开大,所以设置成000
[root@larbeeze management]# java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false While
错误: 必须限制口令文件读取访问权限: /usr/local/java/jdk1.8.0_25/jre/lib/management/jmxremote.password
chmod 000 /usr/local/java/jdk1.8.0_25/jre/lib/management/jmxremote.password
竟然报错了,这个问题是没有配置host
错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: larbeeze.centos32: larbeeze.centos32: unknown error
在/etc/hosts配置下这个host就可以了。
进程启动成功。
3.控制台打开jconsole
下面就是jconsole 连接了。
二 JVisualVM 相对于JConsole更加强大。
1.在任意目录下设置remote.policy文件内容如下:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission ; };
2.下面就是运行jstatd工具了 运行命令的时候需要在remote.policy的目录下。
jstatd -J-Djava.security.policy=remote.policy -p 9000
3. 执行java进程
java While
4.启动jvisuamvm连接进行监控
三 . 根据linux top 命名编写脚本进行监控。
单次监控脚本
#!/bin/sh #program # this program is mainly used to monitor flow's thread condition Eg:cpu mem #history #fileName=result_$(date +%Y%m%d-%H:%M).txt fileName=result_$(date +%Y%m%d-%H).txt #echo "---------------------------------------------------------------------------------------------------- " |tee -a $fileName #echo "---------------------------------------------------------------------------------------------------- "|tee -a $fileName #monitor the process to file #echo "starting to monitor...................." |tee -a $fileName declare -a array array=$(ps -ef | grep While | grep -v grep | awk '{print $2}') #awk 'BEGIN {print split('"\"$test\""', array, "a")}' #awk 'BEGIN {print split($test, array, "\n")}' #-b 以批量模式运行,但不能接受命令行输入; #-c 显示命令行,而不仅仅是命令名; #-d N 显示两次刷新时间的间隔,比如 -d 5,表示两次刷新间隔为5秒; #-i 禁止显示空闲进程或僵尸进程; #-n NUM 显示更新次数,然后退出。比如 -n 5,表示top更新5次数据就退出; #-p PID 仅监视指定进程的ID;PID是一个数值; #-q 不经任何延时就刷新; #-s 安全模式运行,禁用一些效互指令; #-S 累积模式,输出每个进程的总的CPU时间,包括已死的子进程; for element in $array do # echo "$element------------------------------" |tee -a $fileName # top -b -n 1 -d 3 -p $element | grep -v $element | tee -a $fileName top -b -n 1 -d 3 -p $element | grep $element | tee -a $fileName echo " "|tee -a $fileName done echo "----------------------------------------------------"|tee -a $fileName
循环进行多次调用
#!/bin/bash while true;do sh ./monitor.sh sleep 1 continue done
生成的脚本监控出来的数据目前有两种方式展示:
第一种excel对某列做图标
第二种自己写java来解析
贴一下java解析的思路,java解析出来的数据,利用ExtJS中的报表工具,则可以生成表了。
package clouddba.instance; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.mysql.jdbc.StringUtils; public class ProcessShellData { public static void main(String[] args) throws IOException { String file = "D:\\data\\result_20150108-17_50loop.txt"; singlePID(file); // morePID(); } /** * index 8 is cpu * index 9 is mem * process data which the pid is interval such as * pid1 ... * pid2 ... * pid1 ... * pid2 ... * @param file * @throws IOException */ public static void morePID(String file) throws NumberFormatException, IOException{ BufferedReader reader = new BufferedReader(new FileReader(new File(file))); String line = null; String pid = "-1"; int times = 0; int dataSize = 0 ; //nth data List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); while((line = reader.readLine()) != null ){ if(line.trim().equalsIgnoreCase("END")){ break; } if(StringUtils.isEmptyOrWhitespaceOnly(line)){ continue; } String[] arr = line.trim().split("\\s+"); //reset data if(!pid.equals(arr[0])){ pid = arr[0]; times = 0; dataSize ++ ; } Map<String,Object> map = null; if(dataSize > 1){ map = dataList.get(times); if(map == null ){ // System.out.println("null"); }else{ map.put("name", times++ +""); map.put("data"+dataSize,Float.parseFloat(arr[8])+""); } }else{ map = new HashMap<String, Object>(); map.put("name", times++ +""); map.put("data"+dataSize,Float.parseFloat(arr[8])+""); dataList.add(map); } } for(Map<String,Object> map : dataList){ StringBuilder buff = new StringBuilder(); for(int i = 1; i<= dataSize ; i++){ if(i == 1){ buff.append("{ 'name': '"); buff.append(map.get("name")); buff.append("','data"+i+"':"); buff.append(map.get("data"+i) == null ? 0 :map.get("data"+i) ); buff.append(","); continue; } if(i == dataSize){ buff.append("'data"+i+"':"); buff.append(map.get("data"+i) == null ? 0 :map.get("data"+i)); buff.append("},"); continue; } buff.append("'data"+i+"':"); buff.append(map.get("data"+i) == null ? 0 :map.get("data"+i)); buff.append(","); } System.out.println(buff.toString()); } } /** * index 8 is cpu * index 9 is mem * process data which the pid is sequent such as * pid1 ... * pid1 ... * pid2 ... * pid2 ... * @param file * @throws IOException */ public static void morePIDComplex() throws NumberFormatException, IOException{ BufferedReader reader = new BufferedReader(new FileReader(new File("D:\\data\\merge.txt"))); String line = null; String pid = "-1"; int times = 0; int dataSize = 1 ; List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>(); while((line = reader.readLine()) != null ){ if(line.trim().equalsIgnoreCase("END")){ break; } if(StringUtils.isEmptyOrWhitespaceOnly(line)){ continue; } String[] arr = line.trim().split("\\s+"); for(int i=0 ;i<arr.length; i++){ // System.out.println(i +":"+ arr[i]); } if(!pid.equals(arr[0])){ pid = arr[0]; times = 0; dataSize ++ ; } Map<String,Object> map = null; if(dataSize > 1){ map = dataList.get(times); if(map == null ){ System.out.println("null"); } map.put("name", times++ +""); map.put("data"+dataSize,Float.parseFloat(arr[8])+""); }else{ map = new HashMap<String, Object>(); map.put("name", times++ +""); map.put("data"+dataSize,Float.parseFloat(arr[8])+""); dataList.add(map); } } for(Map<String,Object> map : dataList){ StringBuilder buff = new StringBuilder(); for(int i = 1; i<= dataSize ; i++){ if(i == 1){ buff.append("{ 'name': '"); buff.append(map.get("name")); buff.append("','data"+i+"':"); buff.append(map.get("data"+i) == null ? 0 :map.get("data"+i) ); buff.append(","); continue; } if(i == dataSize){ buff.append("'data"+i+"':"); buff.append(map.get("data"+i) == null ? 0 :map.get("data"+i)); buff.append("},"); continue; } buff.append("'data"+i+"':"); buff.append(map.get("data"+i) == null ? 0 :map.get("data"+i)); buff.append(","); } System.out.println(buff.toString()); } } /** * index 8 is cpu * index 9 is mem * process data which the pid is sequent * @param file * @throws IOException */ public static void singlePID(String file) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(new File( file))); String line = null; String pid = "-1"; int times = 0; StringBuilder buff = new StringBuilder(); while ((line = reader.readLine()) != null) { //end if (line.trim().equalsIgnoreCase("END")) { break; } if (StringUtils.isEmptyOrWhitespaceOnly(line)) { continue; } String[] arr = line.trim().split("\\s+"); for (int i = 0; i < arr.length; i++) { // System.out.println(i +":"+ arr[i]); } //reset data if (!pid.equals(arr[0])) { pid = arr[0]; times = 0; buff = new StringBuilder(); } buff.append("{ 'name': '"); buff.append(times++); buff.append("', 'data1':"); buff.append(Float.parseFloat(arr[9])); buff.append("},\n"); } //delete last \n and , buff.deleteCharAt(buff.length()-1); buff.deleteCharAt(buff.length()-1); System.out.println(buff.toString()); } }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>user post test</title> <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" /> <script type="text/javascript" src="ext-all-dev.js"></script> <script type="text/javascript"> //窗口展示 var store = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], data: [ ] }); var chart1=Ext.create('Ext.chart.Chart', { width: 1000, height: 600, animate: true, store: store, axes: [ { type: 'Numeric', position: 'left', fields: ['data1'], label: { renderer: Ext.util.Format.numberRenderer('0,0') }, title: 'CPU', grid: true, minimum: 0 }, { type: 'Category', position: 'bottom', fields: ['name'], title: '采集间隔1s' } ], series: [ { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data1', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data2', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data3', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data4', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data5', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } } ] }); Ext.onReady(function() { Ext.create('Ext.panel.Panel', { width: 1200, height: 1000, layout: 'border', items: [{ title: 'Center Region', region: 'center', // center region is required, no width/height specified xtype: 'panel', layout: 'fit', margins: '5 5 0 0' },{ title: 'North Region is resizable', region: 'north', // position for region xtype: 'panel', split: true, // enable resizing margins: '0 5 5 5', items:[ chart1 ] }], renderTo: Ext.getBody() }); }); </script> </head> <body> </body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>user post test</title> <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" /> <script type="text/javascript" src="ext-all-dev.js"></script> <script type="text/javascript"> //窗口展示 var store = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data1', 'data2', 'data3', 'data4', 'data5'], data: [ { 'name': '108','data1':2.0,'data2':0,'data3':0,'data4':0,'data5':0,'data6':0,'data7':0,'data8':0,'data9':0,'data10':0,'data11':0} ] }); var chart1=Ext.create('Ext.chart.Chart', { width: 1000, height: 500, animate: true, store: store, axes: [ { type: 'Numeric', position: 'left', fields: ['data1'], label: { renderer: Ext.util.Format.numberRenderer('0,0') }, title: 'CPU', grid: true, minimum: 0 }, { type: 'Category', position: 'bottom', fields: ['name'], title: '采集间隔0.1s' } ], series: [ { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data1', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data2', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data3', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data4', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data5', markerConfig: { type: 'circle', size: 1, radius: 1, 'stroke-width': 0 } } ] }); Ext.onReady(function() { Ext.create('Ext.panel.Panel', { width: 1200, height: 1000, layout: 'border', items: [{ title: 'Center Region', region: 'center', // center region is required, no width/height specified xtype: 'panel', layout: 'fit', margins: '5 5 0 0' },{ title: 'North Region is resizable', region: 'north', // position for region xtype: 'panel', split: true, // enable resizing margins: '0 5 5 5', items:[ chart1 ] }], renderTo: Ext.getBody() }); }); </script> </head> <body> </body> </html>
效果图如下:
相关推荐
Jarboot 是一个强大的Java进程管理、诊断的平台,可以在线管理、监控及诊断本地和远程的Java进程.zip
在线管理监控及诊断本地和远程的Java进程源代码.zip
int choice = JOptionPane.showConfirmDialog(null, "请求控制对方电脑", "远程控制系统-Charles", JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.NO_OPTION) { return; } String input =...
监控工具VisualVM VisualVM... 从界面上看还是比较简洁的,左边是树形结构,自动显示当前本机所运行的Java程序,还可以添加远程的Java VM,其中括号里面的PID指的是进程ID。OverView界面显示VM启动参数以及该VM对应的一
将脚本添加到计划任务后可定期自动检查指定的服务运行状态,一旦监控的服务异常停止,将自动启动该服务
java监控工具源码-可集成到项目使用 内存状态、CPU负载、磁盘IO吞吐率、磁盘健康状态、网卡IO 监控 适合用于服务健康监控、线上调优、排查问题、性能测试等场景 支持操作系统监控:内存状态、CPU负载、磁盘IO及吞吐...
jinfo:可以输出并修改运行时的java进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的...
文献综述 计算机科学与技术 基于 java 的远程监控系统的设计与实现 一、前言 近年来,随着计算机及网络的应用普及,千千万万的人们在娱乐、通讯、学习、工作等 各方面都实现了前所未有的信息化,极大地提高了生活...
通过远程监控软件,我们可以进行很多方面的远程控制,包括获取目标电脑屏幕图像、窗口及进程列表;记录并提取远端键盘事件(击键序列,即监视远端键盘输入的内容);可以打开、关闭目标电脑的任意目录并实现资源共享;...
Java远程监控系统设计及功能介绍 Java Java远程监控系统是一个C/S系统,分为服务器端和客户端两部分。服务端与客户端 建 立远程连接,可以抓取客户端的图像,还可以进行远程操作。要实现Java远程监控 系统, 主要是...
本工具包包含设置X11 Forward的详细指导和...方便远程监控服务器资源,尤其是部署了docker容器的Java进程。容器化了以后监控非常麻烦,通过本指导可以比较方便的在远程服务器进行监控,大大提升了我们的远程监控能力。
NULL 博文链接:https://cjf068.iteye.com/blog/1389293
用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用...
用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...