`

远程监控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
分享到:
评论

相关推荐

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

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

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

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

    java 远程监控系统

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

    java内存监控工具jvisualvm

    监控工具VisualVM VisualVM... 从界面上看还是比较简洁的,左边是树形结构,自动显示当前本机所运行的Java程序,还可以添加远程的Java VM,其中括号里面的PID指的是进程ID。OverView界面显示VM启动参数以及该VM对应的一

    远程监控特定服务运行状态

    将脚本添加到计划任务后可定期自动检查指定的服务运行状态,一旦监控的服务异常停止,将自动启动该服务

    java-虚拟机 操作系统监控工具-源码

    java监控工具源码-可集成到项目使用 内存状态、CPU负载、磁盘IO吞吐率、磁盘健康状态、网卡IO 监控 适合用于服务健康监控、线上调优、排查问题、性能测试等场景 支持操作系统监控:内存状态、CPU负载、磁盘IO及吞吐...

    JAVA JVM内存监控工具总结

    jinfo:可以输出并修改运行时的java进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的...

    基于java的远程监控系统的设计与实现【文献综述】.pdf

    文献综述 计算机科学与技术 基于 java 的远程监控系统的设计与实现 一、前言 近年来,随着计算机及网络的应用普及,千千万万的人们在娱乐、通讯、学习、工作等 各方面都实现了前所未有的信息化,极大地提高了生活...

    基于JAVA CS远程监控系统软件的实现(源代码+论文)

    通过远程监控软件,我们可以进行很多方面的远程控制,包括获取目标电脑屏幕图像、窗口及进程列表;记录并提取远端键盘事件(击键序列,即监视远端键盘输入的内容);可以打开、关闭目标电脑的任意目录并实现资源共享;...

    Java远程监控系统设计及功能介绍.doc

    Java远程监控系统设计及功能介绍 Java Java远程监控系统是一个C/S系统,分为服务器端和客户端两部分。服务端与客户端 建 立远程连接,可以抓取客户端的图像,还可以进行远程操作。要实现Java远程监控 系统, 主要是...

    Linux_XForward.zip

    本工具包包含设置X11 Forward的详细指导和...方便远程监控服务器资源,尤其是部署了docker容器的Java进程。容器化了以后监控非常麻烦,通过本指导可以比较方便的在远程服务器进行监控,大大提升了我们的远程监控能力。

    java C/S结构系统远程监控 RM-beta1

    NULL 博文链接:https://cjf068.iteye.com/blog/1389293

    JAVA上百实例源码以及开源项目源代码

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    JAVA上百实例源码以及开源项目

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包9

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包101

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包5

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

Global site tag (gtag.js) - Google Analytics