有没有人有远程JMX JConsole工作?

看来我以前从来没有这样的工作。 目前,我知道这是行不通的。

但是我们启动了我们的Java过程:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=6002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 

我可以telnet到这个端口,并且“有东西在那里”(也就是说,如果我不启动这个进程,没有任何答案,但是如果我这样做的话),但是我不能让JConsole去填充IP和端口。

好像应该这么简单,但没有错误,没有噪音,没有任何东西。 只是不行。

任何人都知道这个热门的提示?

我有一个这样的解决scheme:

如果您的Java进程在防火墙后的Linux上运行,并且您希望在本地计算机上的Windows上启动JConsole / Java VisualVM / Java Mission Control ,以将其连接到Java进程JMX端口

您需要通过SSHlogin访问您的Linux机器。 所有通信将通过SSH连接隧道传输。

提示:无论是否有防火墙,本解决scheme都可以正常工作。

缺点:每次你重新启动你的java进程,你都需要再次执行从4到9的所有步骤。

1.你需要从你的Windows机器的腻子套件:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html上;

至lessputty.exe

2.在你的linux机器上定义一个空闲的端口:

 <jmx-remote-port> 

例:

 jmx-remote-port = 15666 

3.在linux机器上添加参数给java进程

这个必须像这样完成。 如果它完成如下,它适用于防火墙后面的Linux机器(它的工作原因-Djava.rmi.server.hostname=localhost参数)。

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=<jmx-remote-port> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost 

例:

 java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main 

4.获取Java进程的进程ID

 ps -ef | grep <java-processname> result ---> <process-id> 

例:

 ps -ef | grep ch.sushicutta.jmxremote.Main result ---> 24321 

5.findRMIServer存根下载的任意端口

java进程在linux机器上打开一个新的TCP端口,RMI服务器存根可以在这里下载。 此端口还需要通过SSH隧道才能连接到Java虚拟机。

使用netstat -lp这个端口也可以被findlsof -i给出提示什么端口已经从java进程打开了。

注:Java进程启动时,此端口始终更改。

 netstat -lp | grep <process-id> tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/java tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/java result ---> <rmi-server-port> 

例:

 netstat -lp | grep 24321 tcp 0 0 *:15666 *:* LISTEN 24321/java tcp 0 0 *:37123 *:* LISTEN 24321/java result ---> 37123 

6.使用putty从Windows机器启用两个SSH隧道

 Source port: <jmx-remote-port> Destination: localhost:<jmx-remote-port> [x] Local [x] Auto Source port: <rmi-server-port> Destination: localhost:<rmi-server-port> [x] Local [x] Auto 

例:

 Source port: 15666 Destination: localhost:15666 [x] Local [x] Auto Source port: 37123 Destination: localhost:37123 [x] Local [x] Auto 

通过Putty打开SSL隧道的设置

7.使用Putty在启用此SSH-Tunnel的情况下login到您的Linux机器。

保持腻子会话打开。

当您login时,Putty将通过SSH端口22将所有TCP连接发送到Linux计算机。

JMX端口:

 Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666 

RMIServer的存根端口:

 Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123 

8.使用以下URL启动JConsole / Java VisualVM / Java Mission Control以连接到Java Process

这个工作,导致JConsole / Java VisualVM / Java Mission Control认为你连接到本地Windows机器上的一个端口。 但腻子发送所有的有效载荷到端口15666到您的Linux机器。

在Linux机器上,首先java进程给出答案并发回RMIServer端口。 在这个例子中37123。

然后,JConsole / Java VisualVM / Java Mission Control认为它连接到localhost:37123,putty将把整个有效载荷发送到linux机器

java进程回答并且连接已经打开。

 [x] Remote Process: service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi 

例:

 [x] Remote Process: service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi 

通过jmx服务网址连接

9.享受#8-]

添加-Djava.rmi.server.hostname='<host ip>'为我解决了这个问题。

尝试与Java 8

这个解决scheme也适用于防火墙

1.将此添加到远程主机上的Java启动脚本:

 -Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.rmi.port=1616 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost 

2.在计算机上执行此操作。

  • Windows用户

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Linux和Mac用户

    ssh user@remote-host -L 1616:remote-host:1616

3.在电脑上启动jconsole

 jconsole localhost:1616 

4.玩得开心!

PS:在步骤2中,使用ssh-L指定本地(客户端)主机上的端口1616必须转发到远程端。 这是一个SSH隧道,有助于避免防火墙或各种networking问题。

您可能遇到防火墙问题。 问题在于你指定的端口不是唯一使用的端口,它为RMI使用1或甚至2个端口,并且可能被防火墙阻塞。

如果您使用默认的RMIconfiguration,其中一个额外的端口将不会知道,所以您必须打开一个大范围的端口 – 这可能不会使服务器pipe理员感到愉快。

有一个解决scheme,不需要打开很多端口,但我已经得到它使用来源合并的源代码片段和技巧

http://forums.sun.com/thread.jspa?threadID=5267091 – 链接不工作了

http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

甚至有可能设置一个SSH隧道,并仍然能够正常工作:-)

在过去的几天里,我把Google-fu放到了testing之后,终于在编译Stack Overflow和这个页面的答案之后得到了这个工作。http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html 。

从戴尔Boomi页面重新发布:

 To Enable Remote JMX on an Atom If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom. Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file. Add the following lines to the file: -Dcom.sun.management.jmxremote.port=5002 -Dcom.sun.management.jmxremote.rmi.port=5002 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 

我没有看到任何堆栈溢出答案覆盖的一行是

 -Dcom.sun.management.jmxremote.rmi.port=5002 

在我的情况下,我试图检索Kakfa指标,所以我只是改变了上述选项以匹配-Dcom.sun.management.jmxremote.port值。 所以,没有任何的身份validation,最低限度的configuration应该是这样的:

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=(jmx remote port) -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.rmi.port=(jmx remote port) -Djava.rmi.server.hostname=(CNAME|IP Address) 

你在Linux上运行吗? 也许pipe理代理绑定到本地主机:

http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1

专家提示:

RMI端口在任意端口打开。 如果您有防火墙,并且不想打开端口1024-65535(或使用vpn),则需要执行以下操作。

您需要修复RMIregistry和JMX / RMI服务器端口(如具有已知编号)。 您可以通过在lib-dir中添加一个jar文件(catalina-jmx-remote.jar,它在extra中),并在服务器下configuration一个特殊的侦听器来实现:

 <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> 

(当然,通常的标志为激活JMX

  -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname=<HOSTNAME> \ 

请参阅:位于http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html的; JMX远程生命周期监听器

那么你可以连接使用这个可怕的url:

 service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi 

检查你的服务器是否在防火墙后面。 JMX基于RMI,它在启动时打开两个端口。 一个是注册端口,默认是1099,可以通过com.sun.management.jmxremote.port选项指定。 另一个是数据通信,是随机的,这是什么原因造成的问题。 好消息是,从JDK6开始,随机端口可以通过com.sun.management.jmxremote.rmi.port选项指定。

 export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" 

Sushicutta的步骤4-7可以通过将以下行添加到步骤3跳过:

 -Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port> 

例如添加以启动参数:

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.rmi.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost 

对于端口转发,请使用:

 ssh -L 12345:localhost:12345 <username>@<host> 

如果你的主人是踏脚石,只需在上面的步骤石上运行以下代码,将链接端口向前连接:

 ssh -L 12345:localhost:12345 <username>@<host2> 

请注意,需要hostname = localhost来确保jmxremote告诉rmi连接使用隧道。 否则,它可能会尝试连接直接击中防火墙。

通过防火墙获得JMX是非常困难的。 问题是标准RMI使用第二个随机分配的端口(在RMIregistry旁边)。

我们有三种解决scheme可以工作,但是每种情况都需要不同的解决scheme

  1. 基于SSH的JMX隧道与Socks代理,使用标准的RMI与SSH魔术http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

  2. JMX MP(标准RMI的替代品)只使用一个固定端口,但在服务器和客户端上需要一个特殊的jar。http: //meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/

  3. 启动JMX服务器表单代码,可以使用标准RMI并使用固定的第二个端口: https : //issues.apache.org/bugzilla/show_bug.cgi?id=39055

在testing/debugging/诊断远程 JMX问题时,首先总是尝试在包含MBeanServer(即localhost)的同一主机上连接,以排除networking和其他非JMX特定问题。

我在运行Linux Redhat ES3的tomcat上运行JConsole / JVisualVm。

禁用数据包过滤使用以下命令对我来说伎俩:

 /usr/sbin/iptables -I INPUT -s jconsole-host -p tcp --destination-port jmxremote-port -j ACCEPT 

jconsole-host是运行JConsole的主机名或主机地址,jmxremote-port是为com.sun.management.jmxremote.port设置的用于远程pipe理的端口号。

这里已经有了一些很好的答案,但是,我认为这是一个比较简单的方法,值得分享。

sushicutta的方法是好的,但是非常手动,因为你必须每次获得RMI端口。 值得庆幸的是,我们可以通过使用SOCKS代理而不是明确打开端口隧道来解决这个问题。 这种方法的缺点是您在机器上运行的JMX应用程序需要能够configuration为使用代理服务器。 大多数stream程可以通过添加java属性来完成,但有些应用程序不支持这个。

脚步:

  1. 将JMX选项添加到远程Java服务的启动脚本中:

     -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=8090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 
  2. 设置SOCKS代理连接到远程机器:

     ssh -D 9696 user@remotemachine.com 
  3. configuration您的本地Java监视应用程序以使用SOCKS代理(localhost:9696)。 注意: 有时你可以从命令行执行此操作,即:

     jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696 

我正在使用boot2docker来运行Docker容器和Tomcat,我也遇到了同样的问题,解决办法是:

  • 添加-Djava.rmi.server.hostname=192.168.59.103
  • 在主机和docker容器中使用相同的JMX端口,例如: docker run ... -p 9999:9999 ... 使用不同的端口不起作用。

您还需要确保您的计算机名称parsing为JMX绑定的IP; 不是本地主机也不是127.0.0.1。 对我来说,它已经帮助进入到明确定义这个的主机。

通过防火墙获取JMX并不难。 有一个小渔获。 你必须转发你的JMXconfiguration的端口即。 9010和其中一个dynamic端口监听我的机器是> 30000

这些是我工作的步骤(debian在服务器端的防火墙后面,通过本地Mac上的VPN访问):

检查服务器IP

 hostname -i 

使用JVM参数:

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=[jmx port] -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=[server ip from step 1] 

运行应用程序

find正在运行的java进程的pid

检查JMX / RMI使用的所有端口

 netstat -lp | grep [pid from step 4] 

打开防火墙上第5步的所有端口

瞧。

为了做出贡献,这就是我在Tomcat 6的CentOS 6.4上所做的。

  1. closuresiptables服务

     service iptables stop 
  2. 将以下行添加到tomcat6.conf

     CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=[host_ip]" 

这样我就可以使用JConsole从另一台PC进行连接。

我试图让JMC运行Flight Recorder(JFR)来在远程服务器上对NiFi进行configuration文件,该服务器不提供运行JMC的graphics环境。

基于这里给出的其他答案,经过多次试验和错误,这里是我提供给JVM( conf / bootstrap.conf )当我启动NiFi的时候:

 java.arg.90=-Dcom.sun.management.jmxremote=true java.arg.91=-Dcom.sun.management.jmxremote.port=9098 java.arg.92=-Dcom.sun.management.jmxremote.rmi.port=9098 java.arg.93=-Dcom.sun.management.jmxremote.authenticate=false java.arg.94=-Dcom.sun.management.jmxremote.ssl=false java.arg.95=-Dcom.sun.management.jmxremote.local.only=false java.arg.96=-Djava.rmi.server.hostname=10.10.10.92 (the IP address of my server running NiFi) 

我确实把它放在/ etc / hosts中 ,尽pipe我怀疑这是需要的:

 10.10.10.92 localhost 

然后,在启动JMC之后,我使用这些属性创build一个远程连接:

 Host: 10.10.10.92 Port: 9098 User: (nothing) Password: (ibid) 

顺便说一句,如果我点击自定义JMX服务的URL,我看到:

 service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi 

这终于为我做了。