web-dev-qa-db-ja.com

リモート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を埋めさせることはできません。およびポート。

とてもシンプルなはずですが、エラーもノイズも何もありません。うまくいきません。

誰でもこれのホットチップを知っていますか?

111
Will Hartung

これには解決策があります:

Javaプロセスがファイアウォールの背後のLinuxで実行されている場合、開始する場合JConsole/Java VisualVM/Javaローカルマシン上のWindowsのMission ControlをJavaプロセスのJMXポートに接続します

SSHログイン経由でLinuxマシンにアクセスする必要があります。すべての通信は、SSH接続を介してトンネリングされます。

TIP:このソリューションは、ファイアウォールの有無に関係なく機能します。

欠点:Javaプロセスをrestartするたびに、4から9までのすべてのステップを実行する必要があります。再び。


1.ここからWindowsマシン用のPuTTYスイートが必要です。

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プロセスは、Linuxマシンで新しいTCPポートを開きます。このポートでは、RMIサーバースタブをダウンロードできます。このポートは、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-Tunnelを有効にします

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


Settings to open an SSL tunnel via PuTTY


7.このSSH-Tunnelを有効にして、PuTTYでLinuxマシンにログインします。

PuTTYセッションを開いたままにします。

ログインすると、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に接続すると判断し、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


Connect via jmx service url


9.楽しみ#8-]

122
sushicutta

-Djava.rmi.server.hostname='<Host ip>'を追加すると、この問題は解決しました。

79
gnorr

Java 8で試しました

このソリューションはファイアウォールでもうまく機能します

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.楽しんでください!

追伸:ステップ2では、sshおよび-Lを使用して、ローカル(クライアント)ホストのポート1616をリモート側に転送する必要があることを指定します。これはsshトンネルであり、ファイアウォールやさまざまなネットワークの問題を回避するのに役立ちます。

49
freedev

おそらくファイアウォールで問題が発生しています。 「問題」は、指定したポートが使用される唯一のポートではなく、RMIに1つまたは2つ以上のポートを使用することであり、これらはおそらくファイアウォールによってブロックされます。

デフォルトのRMI構成を使用すると、余分なポートの1つが事前に認識されないため、ポートの広い範囲を開く必要があります-サーバー管理者を楽しませない場合があります。

多くのポートを開く必要のないソリューションがありますが、私はそれを組み合わせたソーススニペットとヒントを使用して動作するようになりました

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トンネルを設定して、それを動作させることさえ可能です:-)

19

過去数日間Google-fuをテストした後、Stack Overflowとこのページからの回答をコンパイルした後、ようやくこれを機能させることができました http://help.boomi.com/atomsphere/ GUID-F787998C-53C8-4662-AA06-8B1D32F9D55B.html

Dell 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

スタックオーバーフローの回答カバーを見たことがない1行は、

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

私の場合、Kakfaメトリックを取得しようとしていたので、-Dcom.Sun.management.jmxremote.port値に一致するように上記のオプションを変更しただけです。したがって、いかなる種類の認証もなしで、最低限の構成は次のようになります。

-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)
17
Sergio

Linuxで実行していますか?おそらく、管理エージェントはlocalhostにバインドしています。

http://Java.Sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1

11
Craig Day

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>

Jmxremoteがrmi接続にトンネルを使用するように指示していることを確認するには、hostname = localhostが必要であることに注意してください。そうしないと、直接接続してファイアウォールに到達しようとする場合があります。

7
user2412906

プロト:

RMIポートは任意のportnrで開かれます。ファイアウォールがあり、ポート1024〜65535を開きたくない場合(またはvpnを使用したくない場合)は、次の手順を実行する必要があります。

RMIレジストリとJMX/RMIサーバーのポートを修正する必要があります(既知の番号を持っている場合など)。これを行うには、jarファイル(catalina-jmx-remote.jarはエクストラにあります)をlib-dirに配置し、サーバーの下に特別なリスナーを設定します。

<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 Remote Lifecycle Listener

次に、この恐ろしいURLを使用して接続できます。

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

サーバーがファイアウォールの内側にあるかどうかを確認してください。 JMXはRMIに基づいており、起動時に2つのポートを開きます。 1つはレジスタポートで、デフォルトは1099で、com.Sun.management.jmxremote.portオプションで指定できます。もう1つはデータ通信用で、ランダムです。これが問題の原因です。良いニュースは、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"
5
arganzheng

ファイアウォールを介してJMXを取得するのは非常に困難です。問題は、標準のRMIが2つ目のランダムに割り当てられたポート(RMIレジストリの横)を使用することです。

動作する3つのソリューションがありますが、すべてのケースで異なるものが必要です。

  1. JMX over SSH Tunnel with Socksプロキシ、SSHマジックで標準RMIを使用 http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

  2. JMX MP(標準RMIの代替)、1つの固定ポートのみを使用しますが、サーバーとクライアントに特別なjarが必要です http://meteatamel.wordpress.com/2012/02/13/ jmx-rmi-vs-jmxmp /

  3. JMXサーバーのフォームコードを起動すると、標準のRMIを使用し、固定の2番目のポートを使用できます。 https://issues.Apache.org/bugzilla/show_bug.cgi?id=39055

4
user85155

次は私のために働いた(ポート2101は実際にこれに貢献しなかったと思うが):

-Dcom.Sun.management.jmxremote.port=2100
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
-Dcom.Sun.management.jmxremote.local.only=false
-Dcom.Sun.management.jmxremote.rmi.port=2101
-Djava.rmi.server.hostname=<IP_ADDRESS>OR<HOSTNAME>

リモートマシンからDockerを実行しているサーバーに接続しており、プロセスはコンテナー内にあります。また、firewallDを停止しましたが、ファイアウォールが開いていても2100にtelnetで接続できるので、それが問題だとは思いません。それが役に立てば幸い。

2
Andi M.

リモート JMXの問題をテスト/デバッグ/診断するときは、最初に常に、MBeanServer(つまりlocalhost)を含む同じホストに接続して、ネットワークやその他の非JMX固有の問題を除外してください。

2
eljenso

ここにはすでにいくつかの素晴らしい答えがありますが、共有する価値があると思う、少し単純なアプローチがあります。

sushicuttaのアプローチは優れていますが、毎回RMIポートを取得する必要があるため、非常に手作業です。ありがたいことに、ポートトンネルを明示的に開くのではなく、SOCKSプロキシを使用することで、この問題を回避できます。このアプローチの欠点は、マシンで実行するJMXアプリがプロキシを使用するように設定できる必要があることです。ほとんどのプロセスでは、Javaプロパティを追加することでこれを実行できますが、一部のアプリはこれをサポートしていません。

手順:

  1. リモートJavaサービスの起動スクリプトにJMXオプションを追加します。

    -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 [email protected]
    
  3. SOCKSプロキシ(localhost:9696)を使用するようにローカルJava監視アプリを構成します。注:コマンドラインから時々を実行できます。

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

Boot2dockerを使用してTomcatを内部に持つdockerコンテナーを実行していますが、同じ問題が発生しました。解決策は次のとおりです。

  • -Djava.rmi.server.hostname=192.168.59.103を追加
  • ホストとDockerコンテナで同じJMXポートを使用します(例:docker run ... -p 9999:9999 ...)。別のポートを使用しても機能しません。
1
smallo

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に設定されたポート番号です。

1
kishore

ファイアウォールを介してJMXを取得することは、それほど難しくありません。小さなキャッチが1つあります。 JMXで構成されたポートの両方を転送する必要があります。 9010および動的ポートの1つが、私のマシンでリッスンしている> 30000

0
Lukasz

また、マシン名がJMXがバインドしているIPに解決されることを確認する必要があります。 localhostまたは127.0.0.1ではありません。私にとっては、これを明示的に定義するホストにエントリを追加するのに役立ちました。

0
Joseph

JMCを実行するグ​​ラフィカル環境を提供しないリモートサーバーでNiFiのプロファイルを作成するために、JMCでフライトレコーダー(JFR)を実行しようとしています。

ここで与えられた他の回答と、多くの試行錯誤に基づいて、NiFiを起動するときにJVMに提供するものを以下に示します(conf/bootstrap.conf)。

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に入れましたが、必要だとは思いませんが:

10.10.10.92   localhost

次に、JMCの起動時に、次のプロパティを使用してリモート接続を作成します。

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

ちなみに、カスタムJMXサービスURLをクリックすると、次のように表示されます。

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

これは最終的に私のためにそれをしました。

0
Russ Bateman

これらは私のために働いた手順です(サーバー側のファイアウォールの背後にある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]

アプリケーションを実行する

実行中のJavaプロセスのpidを見つける

jMX/RMIが使用するすべてのポートを確認します

netstat -lp | grep [pid from step 4]

ファイアウォールのステップ5からのすべてのポートを開きます

出来上がり。

0
Mariusz

貢献するために、これがTomcat 6のCentOS 6.4で行ったことです。

  1. Iptablesサービスのシャットダウン

    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から接続できました。

0
Andrés S.