一 关于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>
效果图如下:
相关推荐
标题中的“java开发的一...总的来说,这个Java开发的Windows远程监控软件结合了Java编程语言的跨平台优势,实现了对Windows系统的远程监控功能,涵盖了多种监控及管理操作,并且在开发过程中可能运用了多种技术和工具。
在IT行业中,管理和监控Java进程是一项至关重要的任务,特别是在大型分布式系统中,实时了解应用程序的运行状态、性能指标以及可能出现的问题对于系统维护和优化至关重要。本资源提供的"在线管理监控及诊断本地和...
Jarboot 正是为此目的而设计的一款高效工具,它提供了一个全面的平台,使用户能够轻松地在线管理、监控以及诊断本地和远程的Java进程。通过Jarboot,开发者和系统管理员可以实现对Java应用的精细控制,及时发现并...
int choice = JOptionPane.showConfirmDialog(null, "请求控制对方电脑", "远程控制系统-Charles", JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.NO_OPTION) { return; } String input =...
Java网络实时远程监控系统设计是其中的重要内容,它不仅要求我们掌握网络编程的基本原理,还需要熟悉Java编程语言的特性。在具体设计和实现一个网络实时远程监控系统时,通常会涉及到客户端/服务器架构的设计、...
Jarboot 是一个强大的Java进程管理、诊断的平台,可以在线管理、监控及诊断本地和远程的Java进程。在测试环境、每日构建的集成环境,可以把一系列编译输出等jar文件放入约定的目录,由Jarboot提供友好的浏览器ui界面...
6. 开发框架:Java有许多开源框架可以帮助开发者快速构建远程监控系统,例如JMX (Java Management Extensions) 提供了标准接口和工具来管理和监控Java应用程序,Spring Boot和Spring Cloud提供微服务架构下的监控...
在IT行业中,远程监控报警系统是物联网(IoT)领域的一个重要组成部分,它涉及到设备的自动化监测、数据采集以及异常情况的及时响应。本系统——"温室室内光照度的远程监控报警系统",是一个专为农业环境设计的智能...
它可以通过JMX(Java Management Extensions)接口连接到本地或远程的Java进程,提供内存、线程、类加载、MBean服务器和Garbage Collector等信息的实时监控。 2. **VisualVM**: VisualVM也是JDK自带的一款强大工具...
在实际使用中,我们可以利用这些工具对Java应用进行监控,比如在Jboss这样的应用服务器中,通过添加特定的Java选项(如`-agentpath:libjprofilerti.so=port=8849`)启用JProfiler进行远程监控。通过分析CPU视图和堆...
本项目是基于Java的Jarboot Java进程管理平台设计源码,...Jarboot是一个强大的Java进程管理、诊断的平台,它允许用户在线管理、监控及诊断本地和远程的Java进程,为Java开发者和运维人员提供了一个高效、便捷的工具。
Java提供了多个内置库和API来获取系统信息,如`java.lang.management`包,它包含了管理和监控Java虚拟机(JVM)的类和接口。例如,`ManagementFactory`类可以用来获取JVM的各种统计信息,如线程、类装载、内存等。...
通过以上步骤,我们可以有效地监控服务器上的Java进程状态,确保所有必需的任务都已启动且没有重复启动的情况。这种方法不仅可以提高系统的可靠性和稳定性,还能减轻运维人员的工作负担。此外,还可以根据实际情况...
VisualVM 可以远程监控 JVM,需要在远程机器上启动 jstatd 守护进程, 并在本地机器上使用 VisualVM 连接到远程机器。 使用 VisualVM 可以: * 监控 JVM 的性能,包括堆内存、线程、类加载等信息 * 进行线程 dump ...
本文档详细介绍了在Windows操作系统下通过JProfiler可视化远程监控运行在Linux操作系统上的Tomcat应用服务器进程的具体步骤。 **知识点一:JProfiler概述** - JProfiler是一个集成了多种分析技术的Java剖析工具,它...
`bin`目录可能包含编译后的可执行文件或脚本,用于启动和管理这些Java进程。为了深入了解实现细节,需要查看源代码并理解其逻辑。 总的来说,Java实现守护进程、监听进程以及管理多个进程和JVM涉及多线程、网络编程...
jdb命令是一个强大的调试工具,用于对core文件和正在运行的Java进程进行实时地调试。jdb工具可以帮助开发者快速地定位问题所在,并提供丰富的命令帮助开发者进行调试。 六、jstat命令 jstat命令是一个实时的命令行...
远程监控系统是信息技术领域中的一个重要组成部分,特别是在网络管理和设备维护中具有广泛的应用。在Linux操作系统环境下,使用C语言实现远程监控系统,可以充分利用Linux的开放源码特性和C语言的底层控制能力,实现...
本文档提供了详细的步骤指导用户如何配置Tomcat以支持jconsole远程监控,并介绍了如何在客户端上安装和配置JDK以及如何使用jconsole工具进行远程监控。通过遵循这些步骤,用户可以有效地监控生产环境中的Tomcat应用...