Mam na to rozwiązanie:
Jeśli Twój proces Java działa w systemie Linux za zaporą ogniową i chcesz uruchomić JConsole / Java VisualVM / Java Mission Control w systemie Windows na komputerze lokalnym, aby podłączyć go do portu JMX procesu Java .
Potrzebujesz dostępu do swojego komputera z systemem Linux poprzez logowanie SSH. Cała komunikacja będzie tunelowana przez połączenie SSH.
WSKAZÓWKA: To rozwiązanie działa bez względu na to, czy jest zapora, czy nie.
Wada: za każdym razem, gdy restartujesz proces Java, będziesz musiał ponownie wykonać wszystkie kroki od 4 do 9.
1. Potrzebujesz zestawu szpachli do swojego komputera z systemem Windows stąd:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Przynajmniej putty.exe
2. Zdefiniuj jeden wolny port na swoim komputerze z systemem Linux:
<jmx-remote-port>
Przykład:
jmx-remote-port = 15666
3. Dodaj argumenty do procesu java na komputerze z systemem Linux
Należy to zrobić dokładnie w ten sposób. Jeśli zostanie to zrobione jak poniżej, działa na maszynach linuxowych za zaporami ogniowymi (działa jako przyczyna -Djava.rmi.server.hostname=localhost
argumentu).
-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
Przykład:
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. Uzyskaj identyfikator procesu swojego procesu Java
ps -ef | grep <java-processname>
result ---> <process-id>
Przykład:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Znajdź dowolny port dla pobierania kodów pośredniczących RMIServer
Proces java otwiera nowy port TCP na komputerze z systemem Linux, skąd będzie można pobrać pliki RMI Server-Stubs. Ten port musi być również dostępny za pośrednictwem tunelu SSH, aby uzyskać połączenie z wirtualną maszyną Java.
Dzięki netstat -lp
temu portowi można również znaleźć lsof -i
podpowiedź, który port został otwarty z procesu Java.
UWAGA: Ten port zawsze się zmienia po uruchomieniu procesu 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>
Przykład:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Włącz dwa tunele SSH na komputerze z systemem Windows za pomocą szpachli
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
Przykład:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Zaloguj się do swojej maszyny Linux z Putty z włączonym tunelem SSH.
Pozostaw sesję szpachlową otwartą.
Kiedy jesteś zalogowany, Putty tuneluje wszystkie połączenia TCP do komputera z systemem Linux przez port 22 SSH.
Port JMX:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Uruchom JConsole / Java VisualVM / Java Mission Control, aby połączyć się z procesem Java przy użyciu następującego adresu URL
To działa, ponieważ JConsole / Java VisualVM / Java Mission Control myśli, że łączysz się z portem na lokalnym komputerze z systemem Windows. ale Putty wysyła cały ładunek do portu 15666 na twój komputer z systemem Linux.
Na komputerze z systemem Linux najpierw proces java daje odpowiedź i odsyła port RMIServer. W tym przykładzie 37123.
Następnie JConsole / Java VisualVM / Java Mission Control uważa, że łączy się z localhost: 37123 i putty wyśle cały ładunek do komputera z systemem Linux
Proces java odpowiada i połączenie jest otwarte.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Przykład:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. ENJOY # 8-]