2013-02-20

Tags: ssh , windows7 , remote-control , linux , java

一般拿來當production系統的linux server多數只會提供文字模式介面,server不會沒事裝個 x-window增加它的負擔。在這個前提下,想在server上面執行jconsole、jvisualvm這類有gui畫面的jvm監控程式,基本上是辦不到的,一執行就會馬上噴error然後就掛掉啦。

要怎麼解決這問題,O社官方的解法是用jmx remote這技術解決。這是指你在server端啟用這功能,client端就能遠端連進去看jvm的狀況。不過...相信我,這東西的難用,決對會讓你比中指。光是設定部份我想大概就嚇跑一堆人了,這種鳥蛋solution當然不會是我的選擇。

那...在文字介面下,就只能用jps、jmap這類指令去把jvm的資訊取出來,沒有比較簡單的監控方式嗎?答案是有的,不過也是有點小麻煩就是了。但是相對於jmx remote的方式,卻又簡單太多,而且這招式可不是只有java可用,而是linux上要跑gui介面的程式都可以用這招!

實作的方式,可以參考 這篇文章,裡面把整個前因後果跟重點都提到了。不過...也因為只提重點,所以沒有相關基礎的人會卡關卡老半天。我在這上面就卡了半天多才整個弄出來...Orz

以下是依據這篇文章的實作明細,有需要的人可以參考看看。
===========================================================================
<系統環境簡述>

1.server端:建置在VM上的ubuntu 12.04 64bit。ip是192.168.1.40
2.client端:windows 7 64bit
===========================================================================
<實作流程>

1. server端安裝vnc server與ssh server。ssh部份可參考 這篇,vnc部份參考下行指令進行安裝

sudo apt-get install tightvncserver
2.client端用putty設定ssh連線,並將tunnel的port設定成5901

client端是linux的user可以執行下行指令來做同樣的事
ssh user@192.168.1.40 -L5901:localhost:5901
3.client端用putty連上server,接著在putty console裡面執行下列指令
Xvnc :1 -geometry 1024x768 &
執行後的畫面類似下面這樣。這功能代表你讓linux上的X server具有了vnc server功能
cloudtu@cloudtu-VirtualBox:~$ Xvnc :1 -geometry 1024x768 &
[1] 2690
cloudtu@cloudtu-VirtualBox:~$ 20/02/13 10:34:04 Xvnc version TightVNC-1.3.9
20/02/13 10:34:04 Copyright (C) 2000-2007 TightVNC Group
20/02/13 10:34:04 Copyright (C) 1999 AT&T Laboratories Cambridge
20/02/13 10:34:04 All Rights Reserved.
20/02/13 10:34:04 See http://www.tightvnc.com/ for information on TightVNC
20/02/13 10:34:04 Desktop name 'x11' (cloudtu-VirtualBox:1)
20/02/13 10:34:04 Protocol versions supported: 3.3, 3.7, 3.8, 3.7t, 3.8t
20/02/13 10:34:04 Listening for VNC connections on TCP port 5901
Font directory '/usr/share/fonts/X11/Speedo/' not found - ignoring
Font directory '/usr/share/fonts/X11/75dpi/' not found - ignoring
Font directory '/usr/share/fonts/X11/100dpi/' not found - ignoring
在putty console接著執行下行指令。這代表要把server端所有具有gui畫面程式的畫面輸出都導到vnc client。
export DISPLAY=:1
在putty console接著執行jconsole指令,此時會把jconsole的gui畫面導到vnc client。
jconsole &
4.client端執行vnc client,連到127.0.0.1:5901。這時就會看到server上面執行的jconsle,而且可以進行jvm的監控與分析

===========================================================================
<補充說明>

1.Xvnc指令是指「an X server providing VNC connectivity」,它的重要參數簡述如下。還有不懂之處自已用man指令去查吧
Xvnc [:display] [-geometry  widthxheight]
[:display] -> The display number to use.
[-geometry widthxheight] -> Set desktop width and height.
2.Xvnc裡的「:display」參數(在我的實做中是用「:1」)對應到vnc的port number是 590X,X就是你指定的「:display」數值。
3.要能順利的從client端經由vnc連到server,記的把server端firewall裡的vnc port開啟,不然會一直被server打臉不給連
4.Xvnc指令本身並沒有提供綁定密碼或其它安全機制,client端在看完jconsole監控的jvm狀況後,建議就把server端的Xvnc給關掉,有需要時才利用ssh方式去啟動它。另外就是,記的要在server端設定好firewall的規則,讓特定的ip才許可經由vnc方式連線過來
5.我只用到tightvncserver裡的Xvnc功能,如果想使用tightvncserver的完整功能,可以參考 這篇的簡介