it-swarm.com.de

Hat jemand jemals eine Remote-JMX-JConsole zum Laufen gebracht?

Es scheint, als hätte ich das in der Vergangenheit noch nie gemacht. Derzeit weiß ich, dass es nicht funktioniert.

Wir starten jedoch unseren Java-Prozess:

-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.port=6002
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false

Ich kann mit dem Port telnet und "etwas ist da" (das heißt, wenn ich den Prozess nicht starte, antwortet nichts, aber wenn ich es tue, tut es das), aber ich kann JConsole nicht dazu bringen, die IP zu füllen und Hafen.

Anscheinend sollte es so einfach sein, aber keine Fehler, kein Rauschen, nichts. Funktioniert einfach nicht.

Kennt jemand den heißen Tipp dafür?

110
Will Hartung

Ich habe eine Lösung dafür:

Wenn Ihr Java-Prozess unter Linux hinter einer Firewall ausgeführt wird und Sie JConsole/Java VisualVM/Java Mission Control unter Windows auf Ihrem lokalen Computer starten möchten, um ihn mit dem JMX-Port Ihres Java zu verbinden Prozess.

Sie benötigen Zugriff auf Ihren Linux-Computer über SSH-Login. Die gesamte Kommunikation wird über die SSH-Verbindung getunnelt.

TIP: Diese Lösung funktioniert unabhängig davon, ob eine Firewall vorhanden ist oder nicht.

Nachteil: Bei jedem Neustart Ihres Java-Prozesses müssen Sie alle Schritte 4 - 9 erneut ausführen.


1. Sie benötigen von hier aus die PuTTY-Suite für Ihren Windows-Rechner:

http://www.chiark.greenend.org.uk/~sgtatham/PuTTY/download.html

Zumindest die PuTTY.exe


2. Definieren Sie einen freien Port auf Ihrem Linux-Rechner:

<jmx-remote-port>

Beispiel:

jmx-remote-port = 15666      


3. Fügen Sie dem Java-Prozess auf der Linux-Maschine Argumente hinzu

Dies muss genau so geschehen. Wenn es wie unten beschrieben ausgeführt wird, funktioniert es für Linux-Maschinen hinter Firewalls (es funktioniert aufgrund des -Djava.rmi.server.hostname=localhost-Arguments).

-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

Beispiel:

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. Holen Sie sich die Prozess-ID Ihres Java-Prozesses

ps -ef | grep <Java-processname>

result ---> <process-id>

Beispiel:

ps -ef | grep ch.sushicutta.jmxremote.Main

result ---> 24321


5. Suchen Sie einen beliebigen Port für den Download von RMIServer-Stubs

Der Java-Prozess öffnet einen neuen TCP - Port auf der Linux-Maschine, an dem die RMI Server-Stubs zum Download zur Verfügung stehen. Dieser Port muss auch über SSH-Tunnel verfügbar sein, um eine Verbindung zur Java Virtual Machine herzustellen.

Mit netstat -lp kann dieser Port gefunden werden, außerdem gibt lsof -i Hinweise darauf, welcher Port vom Java-Prozess geöffnet wurde.

HINWEIS: Dieser Port ändert sich immer, wenn der Java-Prozess gestartet wird.

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>

Beispiel:

netstat -lp | grep 24321

tcp        0      0 *:15666     *:*     LISTEN      24321/Java
tcp        0      0 *:37123     *:*     LISTEN      24321/Java


result ---> 37123


6. Aktivieren Sie mit PuTTY zwei SSH-Tunnel von Ihrem Windows-Computer aus

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

Beispiel:

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. Melden Sie sich mit PuTTY bei aktiviertem SSH-Tunnel auf Ihrem Linux-Computer an.

Lassen Sie die PuTTY-Sitzung offen. 

Wenn Sie angemeldet sind, werden alle TCP-Verbindungen von PuTTY über den SSH-Port 22 an die Linux-Maschine geleitet.

JMX-Port:

Windows machine: localhost:15666   >>> SSH >>>   linux machine: localhost:15666

RMIServer-Stub-Port:

Windows Machine: localhost:37123   >>> SSH >>>   linux machine: localhost:37123


8. Starten Sie JConsole/Java VisualVM/Java Mission Control, um über die folgende URL eine Verbindung zu Ihrem Java Process herzustellen

Dies funktioniert, weil JConsole/Java VisualVM/Java Mission Control den Eindruck hat, dass Sie eine Verbindung zu einem Port auf Ihrem lokalen Windows-Computer herstellen. aber PuTTY sendet alle Nutzdaten an den Port 15666 zu Ihrem Linux-Rechner.

Auf dem Linux-Rechner gibt der Java-Prozess zuerst eine Antwort ab und sendet den RMIServer-Port zurück. In diesem Beispiel 37123.

Dann glaubt JConsole/Java VisualVM/Java Mission Control, dass es eine Verbindung zu localhost herstellt: 37123 und PuTTY sendet die gesamte Nutzlast an die Linux-Maschine weiter

Der Java-Prozess antwortet und die Verbindung ist geöffnet.

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi

Beispiel:

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi


Connect via jmx service url


9. GENIESSEN Sie # 8-]

120
sushicutta

Das Hinzufügen von -Djava.rmi.server.hostname='<Host ip>' hat dieses Problem für mich behoben.

79
gnorr

Versucht mit Java 8

Diese Lösung funktioniert auch mit Firewalls

1. Fügen Sie dies Ihrem Java-Startskript auf dem Remote-Host hinzu:

-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. Führen Sie dies auf Ihrem Computer aus.

3. Starten Sie jconsole auf Ihrem Computer

jconsole localhost:1616

4. viel spaß

P.S .: In Schritt 2 legen Sie mit ssh und -L fest, dass der Port 1616 auf dem lokalen Host (Client) zur fernen Seite weitergeleitet werden muss. Dies ist ein SSH-Tunnel und hilft, Firewalls oder verschiedene Netzwerkprobleme zu vermeiden.

43
freedev

Möglicherweise ist ein Problem mit einer Firewall aufgetreten. Das "Problem" besteht darin, dass der von Ihnen angegebene Port nicht der einzige verwendete Port ist. Er verwendet 1 oder möglicherweise sogar 2 weitere Ports für RMI, und diese Ports werden wahrscheinlich von einer Firewall blockiert.

Einer der zusätzlichen Ports wird von vornherein nicht wissen, wenn Sie die Standard-RMI-Konfiguration verwenden. Daher müssen Sie einen großen Bereich an Ports öffnen - was den Server-Administrator möglicherweise nicht amüsiert.

Es gibt eine Lösung, bei der nicht viele Ports geöffnet werden müssen. Ich habe es jedoch mit den kombinierten Quell-Snippets und Tipps von funktioniert

http://forums.Sun.com/thread.jspa?threadID=5267091 - link funktioniert nicht mehr

http://blogs.Oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx

http://Java.Sun.com/javase/6/docs/technotes/guides/management/agent.html

Es ist sogar möglich, einen SSH-Tunnel einzurichten und ihn trotzdem zum Laufen zu bringen :-)

19

Nachdem ich mein Google-fu in den letzten Tagen auf die Probe gestellt hatte, konnte ich es endlich schaffen, nachdem ich die Antworten von Stack Overflow und dieser Seite http://help.boomi.com/atomsphere/GUID) zusammengestellt hatte -F787998C-53C8-4662-AA06-8B1D32F9D55B.html .

Erneute Veröffentlichung von der Dell Boomi-Seite:

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

Die einzige Zeile, die ich nicht gesehen habe, ist die Antwort auf einen Stack Overflow 

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

In meinem Fall habe ich versucht, Kakfa-Metriken abzurufen. Daher habe ich einfach die obige Option geändert, um mit dem -Dcom.Sun.management.jmxremote.port-Wert übereinzustimmen. Ohne jegliche Authentifizierung sollte die absolute Konfiguration wie folgt aussehen:

-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

Laufen Sie unter Linux? Möglicherweise bindet der Verwaltungsagent an localhost:

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

11
Craig Day

Sushicuttas Schritte 4-7 können übersprungen werden, indem Sie die folgende Zeile zu Schritt 3 hinzufügen:

-Dcom.Sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>

zum Hinzufügen von Parametern:

-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

Verbinden Sie sich für die Portweiterleitung mit:

ssh -L 12345:localhost:12345 <username>@<Host>

wenn Ihr Gastgeber ein Sprungbrett ist, ketten Sie einfach den Port nach vorne, indem Sie auf dem Stufenstein Folgendes wie folgt ausführen:

ssh -L 12345:localhost:12345 <username>@<Host2>

Beachten Sie, dass hostname = localhost erforderlich ist, um sicherzustellen, dass die jmxremote der rmi-Verbindung die Verwendung des Tunnels mitteilt. Andernfalls wird möglicherweise versucht, eine direkte Verbindung herzustellen und die Firewall zu treffen.

7
user2412906

PROTIP: 

Der RMI-Port wird an beliebigen Portnrs geöffnet. Wenn Sie eine Firewall haben und die Ports 1024-65535 nicht öffnen (oder vpn verwenden), müssen Sie Folgendes tun.

Sie müssen die Ports der RMI-Registrierung und des JMX/RMI-Servers (wie bei einer bekannten Nummer) reparieren. Sie tun dies, indem Sie eine JAR-Datei (catalina-jmx-remote.jar, die sich in der Extra-Datei befindet) im lib-Verzeichnis ablegen und unter Server einen speziellen Listener konfigurieren:

<Listener className="org.Apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

(Und natürlich die üblichen Flags zum Aktivieren von JMX

    -Dcom.Sun.management.jmxremote  \
    -Dcom.Sun.management.jmxremote.ssl=false \
    -Dcom.Sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \

Siehe: JMX Remote Lifecycle Listener unter http://Tomcat.Apache.org/Tomcat-6.0-doc/config/listeners.html

Dann können Sie eine Verbindung mit dieser fürchterlichen URL herstellen: 

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

Prüfen Sie, ob sich Ihr Server hinter der Firewall befindet. JMX basiert auf RMI, das beim Start zwei Ports öffnet. Einer ist der Register-Port, der Standardwert ist 1099 und kann mit der Option com.Sun.management.jmxremote.port angegeben werden. Die andere ist für die Datenkommunikation und ist zufällig, was das Problem verursacht. Eine gute Nachricht ist, dass dieser zufällige Port ab JDK6 mit der Option com.Sun.management.jmxremote.rmi.port angegeben werden kann. 

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 durch die Firewall zu bekommen ist sehr schwer. Das Problem ist, dass Standard-RMI einen zweiten zufällig zugewiesenen Port (neben der RMI-Registry) verwendet.

Wir haben drei Lösungen, die funktionieren, aber jeder Fall benötigt eine andere:

  1. JMX über SSH-Tunnel mit Socks-Proxy, verwendet Standard-RMI mit SSH-Magie http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

  2. JMX MP (Alternative zu Standard-RMI) verwendet nur einen festen Port, benötigt jedoch eine spezielle Jar-Datei auf Server und Client http://meteatamel.wordpress.com/2012/02/13/jmx -rmi-vs-jmxmp/

  3. Starten Sie den JMX Server-Formularcode. Dort können Sie Standard-RMI und einen festen zweiten Port verwenden: https://issues.Apache.org/bugzilla/show_bug.cgi?id=39055

4
user85155

Versuchen Sie beim Testen/Debuggen/Diagnostizieren von remote JMX-Problemen zuerst immer eine Verbindung mit demselben Host, auf dem sich der MBeanServer befindet (d. H. Localhost), um Netzwerk- und andere nicht JMX-spezifische Probleme auszuschließen.

2
eljenso

Hier gibt es bereits einige großartige Antworten, aber es gibt einen etwas einfacheren Ansatz, der meiner Meinung nach wert ist, geteilt zu werden.

die Vorgehensweise von Sushicutta ist gut, aber sie ist sehr manuell, da Sie den RMI-Port jedes Mal herunterladen müssen. Glücklicherweise können wir dies umgehen, indem Sie einen SOCKS-Proxy verwenden, anstatt die Porttunnel explizit zu öffnen. Der Nachteil dieses Ansatzes ist, dass die JMX-App, die Sie auf Ihrem Computer ausführen, für die Verwendung eines Proxy konfiguriert werden muss. Die meisten Prozesse können Sie durch Hinzufügen von Java-Eigenschaften ausführen. Einige Apps unterstützen dies jedoch nicht.

Schritte:

  1. Fügen Sie dem Startskript für Ihren Remote-Java-Service die JMX-Optionen hinzu:

    -Dcom.Sun.management.jmxremote=true
    -Dcom.Sun.management.jmxremote.port=8090
    -Dcom.Sun.management.jmxremote.ssl=false
    -Dcom.Sun.management.jmxremote.authenticate=false
    
  2. Richten Sie eine SOCKS-Proxy-Verbindung zu Ihrem Remote-Computer ein:

    ssh -D 9696 [email protected]
    
  3. Konfigurieren Sie Ihre lokale Java-Überwachungs-App für die Verwendung des SOCKS-Proxys (localhost: 9696). Hinweis: Sie können manchmal von der Befehlszeile aus tun, d. H .:

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

Ich benutze boot2docker, um Docker-Container mit Tomcat im Inneren auszuführen, und ich habe das gleiche Problem. Die Lösung lautete:

  • -Djava.rmi.server.hostname=192.168.59.103 hinzufügen
  • Verwenden Sie denselben JMX-Port im Host- und Docker-Container, zum Beispiel: docker run ... -p 9999:9999 .... Die Verwendung verschiedener Ports funktioniert nicht.
1
smallo

Folgendes funktionierte für mich (obwohl Port 2101 meiner Meinung nach nicht wirklich dazu beigetragen hat):

-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>

Ich stelle eine Verbindung von einem Remote-Computer zu einem Server her, auf dem Docker ausgeführt wird, und der Prozess befindet sich im Container. Außerdem habe ich die Firewall gestoppt, aber ich glaube nicht, dass dies das Problem war, da ich auch bei geöffneter Firewall bis 2100 telnet.

1
Andi M.

Ich verwende JConsole/JVisualVm unter Windows, das an Tomcat mit Linux Redhat ES3 angeschlossen ist.

Das Deaktivieren der Paketfilterung mit dem folgenden Befehl hat mich ausgemacht:

/usr/sbin/iptables -I INPUT -s jconsole-Host -p tcp --destination-port jmxremote-port -j ACCEPT

dabei ist jconsole-Host entweder der Hostname oder die Hostadresse, unter der JConsole ausgeführt wird, und jmxremote-port ist die Portnummer, die für com.Sun.management.jmxremote.port für die Fernverwaltung festgelegt ist. 

1
kishore

JMX durch die Firewall zu bekommen ist gar nicht so schwer. Es gibt einen kleinen Haken. Sie müssen sowohl Ihren JMX-konfigurierten Port weiterleiten, dh. 9010 und einer der dynamischen Ports hört auf meinem Rechner auf> 30000

0
Lukasz

Sie müssen auch sicherstellen, dass Ihr Computername in die IP-Adresse aufgelöst wird, an die JMX bindet. NICHT localhost oder 127.0.0.1. Für mich hat es geholfen, einen Eintrag in Hosts zu erstellen, der dies explizit definiert.

0
Joseph

Ich versuche, mit JMC den Flight Recorder (JFR) auszuführen, um ein Profil von NiFi auf einem Remote-Server zu erstellen, der keine grafische Umgebung für die Ausführung von JMC bietet.

Basierend auf den anderen Antworten, die hier gegeben wurden, und nach vielen Versuchen und Irrtümern, versuche ich Folgendes an die JVM ( conf/bootstrap.conf ), wenn ich NiFi starte:

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)

Ich habe dies in/etc/hosts eingetragen, obwohl ich bezweifle, dass es nötig ist:

10.10.10.92   localhost

Beim Start von JMC erstelle ich eine Remote-Verbindung mit diesen Eigenschaften:

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

Wenn ich auf die URL des benutzerdefinierten JMX-Diensts klicke, wird Folgendes angezeigt:

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

Das hat es endlich für mich getan.

0
Russ Bateman

Dies sind die Schritte, die für mich funktionierten (Debian hinter der Firewall auf der Serverseite, über VPN von meinem lokalen Mac erreichbar):

Überprüfen Sie die Server-IP

hostname -i

verwenden Sie JVM-Parameter:

-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]

anwendung ausführen

finde die PID des laufenden Java-Prozesses

Überprüfen Sie alle von JMX/RMI verwendeten Ports

netstat -lp | grep [pid from step 4]

Öffnen Sie alle Ports ab Schritt 5 in der Firewall

Voila.

0
Mariusz

Um einen Beitrag zu leisten, habe ich dies bei CentOS 6.4 für Tomcat 6 getan.

  1. Iptables-Dienst herunterfahren

    service iptables stop
    
  2. Fügen Sie der Tomcat6.conf die folgende Zeile hinzu

    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]"
    

Auf diese Weise konnte ich von einem anderen PC aus mit JConsole eine Verbindung herstellen.

0
Andrés S.