Ich habe eine Lösung dafür:
Wenn Ihr Java-Prozess unter Linux hinter einer Firewall ausgeführt wird und Sie JConsole / Java VisualVM / Java Mission Control unter Windows auf Ihrem lokalen Computer starten möchten , um ihn mit dem JMX-Port Ihres Java-Prozesses zu verbinden .
Sie benötigen Zugriff auf Ihren Linux-Computer über SSH-Login. Die gesamte Kommunikation wird über die SSH-Verbindung getunnelt.
TIPP: Diese Lösung funktioniert unabhängig davon, ob eine Firewall vorhanden ist oder nicht.
Nachteil: Jedes Mal, wenn Sie Ihren Java-Prozess neu starten , müssen Sie alle Schritte von 4 bis 9 erneut ausführen.
1. Von hier aus benötigen Sie die Putty-Suite für Ihren Windows-Computer:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Zumindest die putty.exe
2. Definieren Sie einen freien Port auf Ihrem Linux-Computer:
<jmx-remote-port>
Beispiel:
jmx-remote-port = 15666
3. Fügen Sie dem Java-Prozess auf dem Linux-Computer Argumente hinzu
Dies muss genau so erfolgen. Wenn es wie unten gemacht wird, funktioniert es für Linux-Maschinen hinter Firewalls (es funktioniert aufgrund des -Djava.rmi.server.hostname=localhost
Arguments).
-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
Beispiel:
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. Holen Sie sich die Prozess-ID Ihres Java-Prozesses
ps -ef | grep <java-processname>
result ---> <process-id>
Beispiel:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Suchen Sie einen beliebigen Port für den Download von RMIServer-Stubs
Der Java-Prozess öffnet einen neuen TCP-Port auf dem Linux-Computer, über den die RMI Server-Stubs zum Download zur Verfügung stehen. Dieser Port muss auch über den SSH-Tunnel verfügbar sein, um eine Verbindung zur Java Virtual Machine herzustellen.
Mit netstat -lp
diesem Port können Sie auch lsof -i
Hinweise geben, welcher Port aus dem Java-Prozess geöffnet wurde.
HINWEIS: Dieser Port ändert sich immer, wenn der Java-Prozess gestartet wird.
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>
Beispiel:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Aktivieren Sie zwei SSH-Tunnel von Ihrem Windows-Computer mit Putty
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
Beispiel:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Melden Sie sich mit Putty mit aktiviertem SSH-Tunnel bei Ihrem Linux-Computer an.
Lassen Sie die Kitt-Sitzung offen.
Wenn Sie angemeldet sind, tunnelt Putty alle TCP-Verbindungen über den SSH-Port 22 zum Linux-Computer.
JMX-Port:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Starten Sie JConsole / Java VisualVM / Java Mission Control, um über die folgende URL eine Verbindung zu Ihrem Java-Prozess herzustellen
Dies funktioniert, da JConsole / Java VisualVM / Java Mission Control denkt, dass Sie eine Verbindung zu einem Port auf Ihrem lokalen Windows-Computer herstellen. Aber Putty sendet alle Nutzdaten an den Port 15666 an Ihren Linux-Computer.
Auf dem Linux-Computer gibt der Java-Prozess zuerst eine Antwort und sendet den RMIServer-Port zurück. In diesem Beispiel 37123.
Dann glaubt JConsole / Java VisualVM / Java Mission Control, dass es eine Verbindung zu localhost: 37123 herstellt, und putty sendet die gesamte Nutzlast an den Linux-Computer weiter
Der Java-Prozess antwortet und die Verbindung ist offen.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Beispiel:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. GENIESSEN SIE # 8-]