ฉันมีวิธีแก้ปัญหานี้:
หากกระบวนการ Java กำลังทำงานบนลินุกซ์หลังไฟร์วอลล์และคุณต้องการที่จะเริ่มต้นJConsole / Java VisualVM / Java ควบคุมภารกิจบน Windows บนเครื่องท้องถิ่นของคุณเพื่อเชื่อมต่อกับJMX พอร์ตของกระบวนการ
คุณต้องเข้าถึงเครื่อง 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 Tunnel เพื่อเชื่อมต่อกับ Java Virtual Machine
ด้วย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-Tunnels สองช่องจากเครื่อง Windows ของคุณด้วยผงสำหรับอุดรู
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-Tunnel นี้
เปิดเซสชันสีโป๊วทิ้งไว้
เมื่อคุณเข้าสู่ระบบ Putty จะอุโมงค์ TCP-Connections ทั้งหมดไปยังเครื่อง linux ผ่านพอร์ต SSH 22
JMX-Port:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-กุด-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. เริ่ม JConsole / Java VisualVM / Java Mission Control เพื่อเชื่อมต่อกับ Java Process ของคุณโดยใช้ URL ต่อไปนี้
วิธีนี้ใช้ได้ผลทำให้ JConsole / Java VisualVM / Java Mission Control คิดว่าคุณเชื่อมต่อกับพอร์ตบนเครื่อง Windows ในพื้นที่ของคุณ แต่ Putty จะส่งน้ำหนักบรรทุกทั้งหมดไปยังพอร์ต 15666 ไปยังเครื่อง linux ของคุณ
ในเครื่อง linux ขั้นแรกกระบวนการ java จะให้คำตอบและส่งกลับ RMIServer Port ในตัวอย่างนี้ 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-]