これに対する解決策があります:
あなたの場合はJavaプロセスは、ファイアウォールの背後にLinux上で実行されている、あなたが始めたいのJConsole / JavaのVisualVMの/ Javaのミッションコントロールに接続するローカルマシン上のWindows上でのあなたのJavaプロセスのJMXポート。
SSHログイン経由でLinuxマシンにアクセスする必要があります。すべての通信はSSH接続でトンネリングされます。
ヒント:このソリューションは、ファイアウォールの有無に関係なく機能します。
短所: Javaプロセスを再起動するたびに、4〜9のすべての手順を再度実行する必要があります。
1.ここから、Windowsマシン用のパテスイートが必要です。
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
少なくともputty.exe
2. Linuxマシンで1つの空きポートを定義します。
<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. RMIServerスタブダウンロード用の任意のポートを見つける
javaプロセスは、RMIサーバースタブをダウンロードできるLinuxマシン上で新しいTCPポートを開きます。このポートは、Java仮想マシンへの接続を取得するためにSSHトンネルを介して利用可能である必要もあります。
では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. puttyを使用して、Windowsマシンから2つの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
7.このSSHトンネルを有効にしてPuttyでLinuxマシンにログインします。
パテセッションを開いたままにします。
ログインすると、PuttyはすべてのTCP接続をSSHポート22経由でLinuxマシンにトンネリングします。
JMXポート:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. JConsole / Java VisualVM / Java Mission Controlを起動し、次のURLを使用してJavaプロセスに接続します
これは機能し、JConsole / Java VisualVM / Java Mission ControlがローカルWindowsマシンのポートに接続していると見なします。しかし、PuttyはすべてのペイロードをLinuxマシンのポート15666に送信します。
Linuxマシンでは、最初にJavaプロセスが答えを出し、RMIServerポートを送り返します。この例では37123です。
次に、JConsole / Java VisualVM / Java Mission Controlは、localhost:37123に接続し、パテがペイロード全体を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-]