誰かがリモートJMX JConsoleを動作させることはありますか?


120

過去にこれを機能させるのは初めてのようです。現在、私はそれが機能しないことを知っています。

しかし、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の入力を機能させることができません。とポート。

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

誰もがこのためのヒントを知っていますか?


3
youreのはこのTOMCAT使用している場合は、解決策になることがあります。 stackoverflow.com/questions/1263991/...
Hajo Thelen

5
ここで何かを受け入れるのを忘れましたか?
グレー

回答:


126

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

あなたの場合は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 -iJavaプロセスフォーム開かれているどのポートヒントを提供します。

注:このポートは、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


Putty経由でSSLトンネルを開くための設定


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


jmxサービスURL経由で接続


9.楽しむ#8-]


1
ここでちょっとした質問-rmiなしでJMX接続を行うことは不可能ですか?
Kumar Vaibhav 2015

5
rmi.portを固定ポート番号に設定できるため、RMIServerスタブのダウンロード用に任意のポートを設定できるというヒントを得ました。これは、Javaプロパティ「com.sun.management.jmxremote.rmi.port = <rmi-server-port>」で機能するはずです。Oracle Java VMのドキュメントに記載されていない機能のように見えます。
sushicutta 2015

1
確かに、キーストアとトラステッドストアをセットアップする必要がある
TekiusFanatikus

同じプロセスですが、テーブルにそのようなオブジェクトはありませんでした
wener

2
@sushicuttaは、このヒントを回答に追加でき、完全に正常に機能し、4から6までのステップを削除できます。問題は、転送ポートが元のポートと同じである必要があり、jmxポートとrmiポートの両方も同じ
みすぼらしい

80

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


2
私の場合、IPアドレス(-Djava.rmi.server.hostname = <ip>)を追加する必要があります。hostname -iは2つのIPアドレスを与え、正しいアドレスはリストの2番目でした。
Georgy Bolyuba、2009年

4
私の問題は解決しませんでした。Windows-2-windowsの接続は問題ありませんが、WindowsのJVM Jvisualvm.exeから接続して、SUSEでOracle JDK 1.6.024を実行しているJavaサービスを監視しようとすると、接続に失敗します。このため、この人の質問はまだ答えられていないと思います。
djangofan 2011年

これで問題は解決しました。これと通常の3(認証/ポート/ SSL)セットに加えて、リモートで接続できるようになりました。ただし、ボックスは複数の仮想インターフェイスでリッスンしているため、ホストを指定しないとjvmが混乱した可能性があります。
ニコリ

最後に、私のosxラップトップでjconsoleを接続する私の問題を解決しました。ありがとう。
rado

私のために働いた。ありがとうございました!
ジェフ

58

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

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


1
驚くばかり!!6時間以上、jmx-remoteをjava8のActiveMQインスタンスに試しました。ついにうまくいったこと!! ありがとう!:)
Rop

ありがとう、あなたのように私も1日ほど苦労しました、そして、多くの仕事の後に私はただ考えました:「私はこれをSOに書かなければならない!!」
freedev 2016年

2
Oracleが「com.sun.management.jmxremote.rmi.port」、「java.rmi.server.hostname」、 docs.oracle.com / javase / 8 / docs / technotes / guides / management /… Iそれが私の問題だったと思います。
Rop

なぜなら、私の知る限り、この問題はJMXに関するものではなく、RMIがどのように機能するかです。たとえば、この場合、クライアント/サーバーの実装でrmiを使用するjmeterで同じ問題が発生しました。
freedev 2016年

2
できます。トンネルに関する私の経験を追加するだけです:1)「-L 1616:localhost:1616」で「localhost」を使用できます2)送信元ポートを変更できません。つまり、これは機能しません:「-L 9999:localhost:1616」
gargii 2017年

19

ファイアウォールに問題がある可能性があります。「問題」は、指定したポートが使用される唯一のポートではなく、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トンネルを設定してそれを動作させることも可能です:-)


2
ここの別の回答で述べたように、simplygenius.com / 2010/08 / jconsole-via-socks-ssh-tunnel.html-Djava.rmi.server.hostnameを設定することで説明されているエイリアスのみを使用して、ファイアウォールを回避することができました。
ダミアン

将来の読者への注意:へのリンクforums.sun.comが壊れています
CDspace

1
将来の読者への注意:へのリンクblogs.oracle.comは壊れています。
グリムロック

17

私のGoogle-fuを過去2日間テストしたところ、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

Stack Overflowの回答のカバーを見たことがない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)

1
「Google-fu」の1つ
kevinarpe 2015年

「com.sun.management.jmxremote.rmi.port」も私にとって重要でした。この回答もご覧ください:stackoverflow.com/a/22306586/123205
David

「com.sun.management.jmxremote.local.only」は必要なかったので、構成が本当に「最低限」であるとは思いません
David


7

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が必要であることに注意してください。そうしないと、直接接続を試みてファイアウォールにヒットする可能性があります。


この方法は私に役立ちます:(1)欠落したJMXパラメーターを追加してアプリを再起動します(2)次にssh -L <JMX_port>:localhost:<JMX_port> <remote_user>@<remote_host> ローカルマシンで実行 します(3)次に次を使用してリモートJMXに接続します: jconsole <remote_host>:<JMX_port>
Rib47

6

ヒント:

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

RMIレジストリとJMX / RMIサーバーのポートを(既知の番号を持つ場合と同様に)修正する必要があります。これを行うには、jar-file(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リモートライフサイクルリスナー

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

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

上記のextras jarを試してみたところ、RMIポートが指定どおりにリッスンしているのを確認できましたが、VisualVMでJVMポートに接続した後もRMIがランダムポートを使用しています。回避策:「lsof -i」でポートを監視し、接続がブロックされているポートを開きます。
Joseph Lust 2013年

5

サーバーがファイアウォールの背後にあるかどうかを確認します。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"

4

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

機能する解決策は3つありますが、ケースごとに異なる解決策が必要です。

  1. JMX over SSHトンネルとSocksプロキシ、標準RMIとSSHマジック 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


他のすべての回答はこれに追加する必要があります
ruruskyi

2

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


2

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

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 user@remotemachine.com
    
  3. SOCKSプロキシ(localhost:9696)を使用するようにローカルJava監視アプリを構成します。注:コマンドラインからこれを実行できる場合あります。

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

2

以下は私のために働きました(私はポート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を停止しましたが、ファイアウォールが開いている状態でもtelnetで2100に接続できるため、問題はないと思います。それが役に立てば幸い。


1

Linux Redhat ES3を実行しているTomcatにフックするWindowsで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に設定されたポート番号です。


2
SUSE Amazon EC2インスタンスでは動作しませんでした。問題は他の場所にあると思います。
djangofan 2011年

1

私はboot2dockerを使用してTomcatを内部でdockerコンテナーを実行していますが、同じ問題があり、解決策は次のとおりです。

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

0

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


0

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


0

これらは私のために働いたステップです(サーバー側のファイアウォールの後ろの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

貢献するために、これは私がTomOS 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

JMCでFlight Recorder(JFR)を実行して、JMCを実行するグ​​ラフィカル環境を提供していないリモートサーバーでNiFiをプロファイリングしようとしています。

ここで与えられた他の回答に基づいて、そして多くの試行錯誤に基づいて、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

これでようやくできました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.