У меня есть решение для этого:
Если ваш процесс Java выполняется в Linux за брандмауэром, и вы хотите запустить JConsole / Java VisualVM / Java Mission Control в Windows на локальном компьютере, чтобы подключить его к порту JMX вашего процесса Java .
Вам нужен доступ к вашей Linux-машине через SSH-вход. Все коммуникации будут туннелироваться через соединение SSH.
СОВЕТ: Это решение работает независимо от того, есть брандмауэр или нет.
Недостаток: каждый раз, когда вы перезапускаете свой Java-процесс, вам нужно будет снова выполнять все шаги с 4 по 9.
1. Вам понадобится набор шпатлевок для вашей машины с Windows отсюда:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
По крайней мере, putty.exe
2. Определите один свободный порт на вашем компьютере с Linux:
<jmx-remote-port>
Пример:
jmx-remote-port = 15666
3. Добавьте аргументы в java-процесс на Linux-машине.
Делать это нужно именно так. Если это сделано, как показано ниже, это работает для машин 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.
ps -ef | grep <java-processname>
result ---> <process-id>
Пример:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Найдите произвольный порт для загрузки заглушек RMIServer.
Java-процесс открывает новый TCP-порт на Linux-машине, где RMI Server-Stubs будут доступны для загрузки. Этот порт также должен быть доступен через туннель SSH для подключения к виртуальной машине Java.
С netstat -lp
этим портом также можно найти lsof -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. Включите два SSH-туннеля на вашем компьютере с Windows с помощью 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
Пример:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Войдите в свою Linux-машину с помощью Putty с включенным SSH-туннелем.
Оставьте шпатлевку открытой.
Когда вы вошли в систему, Putty будет туннелировать все TCP-соединения с Linux-машиной через SSH-порт 22.
JMX-порт:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Сто-порт:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Запустите JConsole / Java VisualVM / Java Mission Control, чтобы подключиться к вашему Java-процессу, используя следующий URL-адрес.
Это работает, потому что JConsole / Java VisualVM / Java Mission Control думает, что вы подключаетесь к порту на локальной машине Windows. но Putty отправляет всю полезную нагрузку на порт 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
9. НАСЛАЖДАЙТЕСЬ № 8-]