`

远程监控Java进程的工具

 
阅读更多

 

一 关于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>

    效果图如下:

   

 

 

  • 大小: 41.8 KB
  • 大小: 36 KB
  • 大小: 22.2 KB
  • 大小: 36.2 KB
  • 大小: 36.2 KB
  • 大小: 36.2 KB
  • 大小: 64.8 KB
  • 大小: 60.2 KB
分享到:
评论

相关推荐

    java开发的一个windows的远程监控软件

    标题中的“java开发的一...总的来说,这个Java开发的Windows远程监控软件结合了Java编程语言的跨平台优势,实现了对Windows系统的远程监控功能,涵盖了多种监控及管理操作,并且在开发过程中可能运用了多种技术和工具。

    在线管理监控及诊断本地和远程的Java进程源代码.zip

    在IT行业中,管理和监控Java进程是一项至关重要的任务,特别是在大型分布式系统中,实时了解应用程序的运行状态、性能指标以及可能出现的问题对于系统维护和优化至关重要。本资源提供的"在线管理监控及诊断本地和...

    Jarboot 是一个强大的Java进程管理、诊断的平台,可以在线管理、监控及诊断本地和远程的Java进程.zip

    Jarboot 正是为此目的而设计的一款高效工具,它提供了一个全面的平台,使用户能够轻松地在线管理、监控以及诊断本地和远程的Java进程。通过Jarboot,开发者和系统管理员可以实现对Java应用的精细控制,及时发现并...

    java 远程监控系统

    int choice = JOptionPane.showConfirmDialog(null, "请求控制对方电脑", "远程控制系统-Charles", JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.NO_OPTION) { return; } String input =...

    java网络实时远程监控设计

    Java网络实时远程监控系统设计是其中的重要内容,它不仅要求我们掌握网络编程的基本原理,还需要熟悉Java编程语言的特性。在具体设计和实现一个网络实时远程监控系统时,通常会涉及到客户端/服务器架构的设计、...

    Jarboot 是一个强大的Java进程管理、诊断的平台,可以在线管理、监控及诊断本地和远程的Java进程

    Jarboot 是一个强大的Java进程管理、诊断的平台,可以在线管理、监控及诊断本地和远程的Java进程。在测试环境、每日构建的集成环境,可以把一系列编译输出等jar文件放入约定的目录,由Jarboot提供友好的浏览器ui界面...

    Java远程监控软件

    6. 开发框架:Java有许多开源框架可以帮助开发者快速构建远程监控系统,例如JMX (Java Management Extensions) 提供了标准接口和工具来管理和监控Java应用程序,Spring Boot和Spring Cloud提供微服务架构下的监控...

    温室室内光照度的远程监控报警系统

    在IT行业中,远程监控报警系统是物联网(IoT)领域的一个重要组成部分,它涉及到设备的自动化监测、数据采集以及异常情况的及时响应。本系统——"温室室内光照度的远程监控报警系统",是一个专为农业环境设计的智能...

    java监控工具

    它可以通过JMX(Java Management Extensions)接口连接到本地或远程的Java进程,提供内存、线程、类加载、MBean服务器和Garbage Collector等信息的实时监控。 2. **VisualVM**: VisualVM也是JDK自带的一款强大工具...

    Java性能监控工具

    在实际使用中,我们可以利用这些工具对Java应用进行监控,比如在Jboss这样的应用服务器中,通过添加特定的Java选项(如`-agentpath:libjprofilerti.so=port=8849`)启用JProfiler进行远程监控。通过分析CPU视图和堆...

    基于Java的Jarboot Java进程管理平台设计源码

    本项目是基于Java的Jarboot Java进程管理平台设计源码,...Jarboot是一个强大的Java进程管理、诊断的平台,它允许用户在线管理、监控及诊断本地和远程的Java进程,为Java开发者和运维人员提供了一个高效、便捷的工具。

    java监控开发示例

    Java提供了多个内置库和API来获取系统信息,如`java.lang.management`包,它包含了管理和监控Java虚拟机(JVM)的类和接口。例如,`ManagementFactory`类可以用来获取JVM的各种统计信息,如线程、类装载、内存等。...

    shell脚本实现服务器进程监控的方法

    通过以上步骤,我们可以有效地监控服务器上的Java进程状态,确保所有必需的任务都已启动且没有重复启动的情况。这种方法不仅可以提高系统的可靠性和稳定性,还能减轻运维人员的工作负担。此外,还可以根据实际情况...

    Java自带的性能监控工具使用简介

    VisualVM 可以远程监控 JVM,需要在远程机器上启动 jstatd 守护进程, 并在本地机器上使用 VisualVM 连接到远程机器。 使用 VisualVM 可以: * 监控 JVM 的性能,包括堆内存、线程、类加载等信息 * 进行线程 dump ...

    JProfiler在Windows可视化远程监控Linux上Tomcat进程的安装步骤.pdf

    本文档详细介绍了在Windows操作系统下通过JProfiler可视化远程监控运行在Linux操作系统上的Tomcat应用服务器进程的具体步骤。 **知识点一:JProfiler概述** - JProfiler是一个集成了多种分析技术的Java剖析工具,它...

    java实现守护进程,有单独的监听进程, 两个或多个进程,两个或多个jvm

    `bin`目录可能包含编译后的可执行文件或脚本,用于启动和管理这些Java进程。为了深入了解实现细节,需要查看源代码并理解其逻辑。 总的来说,Java实现守护进程、监听进程以及管理多个进程和JVM涉及多线程、网络编程...

    Java内存泄露_JVM监控工具介绍

    jdb命令是一个强大的调试工具,用于对core文件和正在运行的Java进程进行实时地调试。jdb工具可以帮助开发者快速地定位问题所在,并提供丰富的命令帮助开发者进行调试。 六、jstat命令 jstat命令是一个实时的命令行...

    远程监控系统

    远程监控系统是信息技术领域中的一个重要组成部分,特别是在网络管理和设备维护中具有广泛的应用。在Linux操作系统环境下,使用C语言实现远程监控系统,可以充分利用Linux的开放源码特性和C语言的底层控制能力,实现...

    jconsole远程监控配置手册(经典)

    本文档提供了详细的步骤指导用户如何配置Tomcat以支持jconsole远程监控,并介绍了如何在客户端上安装和配置JDK以及如何使用jconsole工具进行远程监控。通过遵循这些步骤,用户可以有效地监控生产环境中的Tomcat应用...

Global site tag (gtag.js) - Google Analytics