轉(zhuǎn)載:
http://www.cnblogs.com/liuan/archive/2012/06/13/2548558.html
系統(tǒng):CentOS6.0 安裝的Xen版本:4.1.2
在centos下安裝xen不是很順利,遇到很多問題。安裝過程主要參考了以下兩個(gè)文檔:
http://wiki.xen.org/xenwiki/RHEL6Xen4Tutorial?action=fullsearch&value=linkto%3A%22RHEL6Xen4Tutorial%22&context=180
這個(gè)方法可以正常安裝xen,并指出RedHat 6 下安裝xen 會(huì)遇到的問題,只是安裝過程復(fù)雜,不是源碼安裝。
http://www.cnblogs.com/feisky/archive/2012/04/10/2441307.html
這個(gè)是xen的源碼編譯安裝,也是centos下,安裝xen 4.1.2,但是經(jīng)過實(shí)踐,這樣安裝出來存在一些問題,很意外的。解決起來很頭痛。
在上面這個(gè)方法上,具體的描述我的安裝過程。
系統(tǒng)和安裝的xen版本上面有介紹,開始著手安裝xen了。
1.下載Xen的源碼
1 wget http://bits.xensource.com/oss-xen/release/4.1.2/xen-4.1.2.tar.gz
2.安裝必備軟件包
1 yum groupinstall "Development Libraries" 2 yum groupinstall "Development Tools" 3 yum install transfig wget texi2html libaio-devel dev86 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel 4 bzip2-devel pciutils-libs pciutils-devel SDL-devel libX11-devel gtk2-devel bridge-utils PyXML qemu-common qemu-img mercurial libidn-devel 5 yum -y install glibc-devel.i686texinfo libuuid-devel iasl python-lxml 6 yum -y install openssl openssl-devel 7 yum -y install ncurses ncurses-* 8 yum -y install python-devel
3.編譯安裝Xen hypervisor
1 tar zxvf xen-4.1.2.tar.gz 2 cd xen-4.1.2 3 make world
在此可能會(huì)遇到如下問題:

解決辦法:yum –y install texinfo
4.將Xen加入到啟動(dòng)腳本:
1 /sbin/chkconfig --add xend 2 /sbin/chkconfig --add xencommons 3 /sbin/chkconfig --add xendomains 4 /sbin/chkconfig xend on 5 /sbin/chkconfig xendomains on 6 /sbin/chkconfig xencommons on
5.編譯安裝Linux3.1.2內(nèi)核
1 wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.1.2.tar.bz2 2 tar -jxvf linux-3.1.3.tar.bz2 3 make menuconfig 4 5 Processor type and features --- > 6 選中Paravirtualized Guest Support 7 Device Drivers ---> 8 Xen driver support ---> 9 全部選* 10 11 修改:CONFIG_XEN_DEV_EVTCHN=y(如果是m,開機(jī)時(shí)無法啟動(dòng)xencommons)
注意:僅僅上面的是不夠的,還需要修改:否則在創(chuàng)建虛擬機(jī)的過程中遇到這樣的問題:

注意:Device 0 (vif) could not be connected. HotPlug scripts not working.
在.config文件中做如下修改,就可以解決問題了
1 CONFIG_XEN_BLKDEV_BACKEND=m 2 CONFIG_XEN_NETDEV_BACKEND=m
接下來開始編譯安裝了:
1 make 2 make modules 3 make modules_install 4 make install 5 depmod 3.1.2 6 mkinitrd -v -f --with=aacraid --with=sd_mod --with=scsi_mod initramfs-3.1.2.img 3.1.2
6.配置grub:
1 title Xen (3.1.2-xen) 2 root (hd0,0) 3 kernel /xen-4.1.2.gz dom0_mem=512M 4 module /vmlinuz-3.1.2 ro root=UUID=3f920108-b74b-46b9-81c2-aff834494381 5 rd_DM_UUID=ddf1_4c5349202020202010000055000000004711471100001450 rd_NO_LUKS rd_NO_LVM rd_NO_MD LANG=en_US.UTF-8 6 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet 7 module /initramfs-3.1.2.img
這個(gè)配置在第4行后面root=UUID隨自己的系統(tǒng)
7.安裝virt-manager
1 yum install libvirt virt-manager xorg-x11-xauth
8. 重新編譯libvirt
在文章前面第一個(gè)鏈接中,說明了,redhat6系統(tǒng)中,默認(rèn)的libvirt是不支持xen的,如果直接使用默認(rèn)的這會(huì)出現(xiàn)如下的問題:
注意virt-manager & 這個(gè)命令中的'&' 代表該進(jìn)程后臺(tái)運(yùn)行
1 [root@el6 ~]# virt-manager & 2 [1] 2867 3 Unable to open connection to hypervisor URI 'xen:///': 4 no connection driver available for xen:/// 5 Traceback (most recent call last): 6 File "/usr/share/virt-manager/virtManager/connection.py", line 992, in _try_open 7 None], flags) 8 File "/usr/lib64/python2.6/site-packages/libvirt.py", line 111, in openAuth 9 if ret is None:raise libvirtError('virConnectOpenAuth() failed') 10 libvirtError: no connection driver available for xen:///
開始重新編譯libvirt解決以上的問題。
以下的操作都在非xen系統(tǒng)中進(jìn)行:
沒個(gè)系統(tǒng)遇到的缺的包不一樣,我的系統(tǒng)中還缺失xen-devel包,并且在yum

1 [root@el6 ~]# cd /root/src 2 [root@el6 src]# wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/libvirt-0.8.1-27.el6.src.rpm 3 [root@el6 src]# rpm -i libvirt-0.8.1-27.el6.src.rpm 4 [root@el6 src]# wget http://pasik.reaktio.net/xen/patches/libvirt-spec-rhel6-enable-xen.patch 5 [root@el6 src]# cd /root/rpmbuild/SPECS 6 [root@el6 SPECS]# cp -a libvirt.spec libvirt.spec.orig 7 [root@el6 SPECS]# patch -p0 < ~/src/libvirt-spec-rhel6-enable-xen.patch 8 patching file libvirt.spec 9 10 [root@el6 SPECS]# rpmbuild -bb libvirt.spec 11 error: Failed build dependencies: 12 libnl-devel >= 1.1 is needed by libvirt-0.8.1-27.el6.x86_64 13 xhtml1-dtds is needed by libvirt-0.8.1-27.el6.x86_64 14 libudev-devel >= 145 is needed by libvirt-0.8.1-27.el6.x86_64 15 libpciaccess-devel >= 0.10.9 is needed by libvirt-0.8.1-27.el6.x86_64 16 yajl-devel is needed by libvirt-0.8.1-27.el6.x86_64 17 libpcap-devel is needed by libvirt-0.8.1-27.el6.x86_64 18 avahi-devel is needed by libvirt-0.8.1-27.el6.x86_64 19 parted-devel is needed by libvirt-0.8.1-27.el6.x86_64 20 device-mapper-devel is needed by libvirt-0.8.1-27.el6.x86_64 21 numactl-devel is needed by libvirt-0.8.1-27.el6.x86_64 22 netcf-devel >= 0.1.4 is needed by libvirt-0.8.1-27.el6.x86_64 23 [root@el6 SPECS]# yum install libnl-devel xhtml1-dtds libudev-devel libpciaccess-devel yajl-devel libpcap-devel avahi-devel parted-devel device-mapper-devel numactl-devel netcf-devel

安裝的時(shí)候,提示No packages xen-devel available 。
在多次替換yum源之后,依然無法解決這個(gè)xen-devel包缺失的問題。
隨后的解決方案如下:
在網(wǎng)上下載xen-devel rpm 包,安裝遇到依賴問題,接著下載xen-libs rpm 包,接著還有其他的依賴問題,同樣查找。
具體鏈接: 搜索xen-devel,找到符合系統(tǒng)版本的
1 http://rpm.pbone.net/index.php3
我下載的版本是:
xen-devel-4.1.2_03-1.1.x86_64.rpm
安裝xen-devel還依賴其他的包,如下:
xen-libs-4.1.2_03-1.1.x86_64.rpm
liblzma5-5.0.3-7.1.x86_64.rpm
glibc-common-2.14.90-14.x86_64.rpm
glibc-2.14.90-14.x86_64.rpm
強(qiáng)制安裝如上的包。
如果缺少依賴包,依次去下載對(duì)應(yīng)版本,解決問題。這個(gè)過程很蛋疼。
如果所有的依賴包都安裝上后,接著下面的操作:
1 [root@gb31 SPECS]# rpmbuild -bb libvirt.spec 2 After a while you'll see: 3 Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-0.8.1-27.el6.x86_64.rpm 4 Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-client-0.8.1-27.el6.x86_64.rpm 5 Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-devel-0.8.1-27.el6.x86_64.rpm 6 Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-python-0.8.1-27.el6.x86_64.rpm 7 Wrote: /root/rpmbuild/RPMS/x86_64/libvirt-debuginfo-0.8.1-27.el6.x86_64.rpm
如果有如上的顯示則安裝成功。
如果遇到屏幕顯示test 。。 一直卡住之后,卸載掉系統(tǒng)中已經(jīng)安裝的libvirt包,再重新嘗試,即可。
接著如下:注意,可能版本不一樣
如果還顯示存在test失敗,make失敗,與libvirt版本相關(guān),這個(gè)問題很蛋疼,多試下幾個(gè)版本吧。就可以解決。
1 [root@el6 ~]# cd /root/rpmbuild/RPMS/x86_64/ 2 [root@el6 x86_64]# rpm -Uvh --force libvirt-0.8.1-27.el6.x86_64.rpm libvirt-client-0.8.1-27.el6.x86_64.rpm libvirt-python-0.8.1-27.el6.x86_64.rpm 3 Preparing... ########################################### [100%] 4 1:libvirt-client ########################################### [ 33%] 5 2:libvirt ########################################### [ 67%] 6 3:libvirt-python ########################################### [100%]
9.進(jìn)入xen系統(tǒng)
重啟系統(tǒng),進(jìn)入xen系統(tǒng)。
嘗試輸入如下命令:xm-list ,xm-info
再接著嘗試如下命令:virt-install,嘗試著安裝虛擬機(jī)
如果顯示的錯(cuò)誤如下:
1 ERROR unable to connect to ‘localhost:8000′: Connection refused
則需要去做如下修改:
1 解決方案:查看libvirtd服務(wù)是否啟動(dòng),關(guān)閉防火墻,在/etc/xen/xend-config.sxp 2 (xend-http-server yes) 3 # Port xend should use for the HTTP interface, if xend-http-server is set. 4 (xend-port 8000) 5 去掉上面兩個(gè)括弧的注釋,ok
再重新啟動(dòng)xend服務(wù)
至此,可以嘗試在桌面上氣筒virtual machine manager 去創(chuàng)建虛擬機(jī)。
創(chuàng)建過程如果如下問題:

可以系統(tǒng)路勁的問題,在usr/lib/xen/bin下找到qemu-dm放到lib64下對(duì)應(yīng)的路徑。
就ok。
10.配置網(wǎng)橋橋接模式
修改ifcfg-eth0如下:
1 DEVICE="eth0" 2 BOOTPROTO="static" 3 HWADDR="**********“ 4 NM_CONTROLLED="no" 5 ONBOOT="yes" 6 IPADDR="*******” 7 NETMASK="255.255.0.0" 8 GATEWAY="********" 9 TYPE=Ethernet 10 DNS1="8.8.8.8" 11 DNS2="8.8.4.4" 12 BRIDGE=br100
創(chuàng)建ifcfg-br100文件,內(nèi)容如下:
1 DEVICE="br100" 2 BOOTPROTO="static" 3 HWADDR="*********" 4 NM_CONTROLLED="no" 5 ONBOOT="yes" 6 IPADDR="*******" 7 NETMASK="255.255.0.0" 8 GATEWAY="*******" 9 TYPE=Bridge 10 DEFROUTE=yes 11 DNS1="8.8.8.8" 12 DNS2="8.8.4.4"
11.ok,至此,xen的安裝結(jié)束了,可以放心大膽的創(chuàng)建虛擬機(jī)了。
android.permission.ACCESS_CHECKIN_PROPERTIES
//允許讀寫訪問”properties”表在checkin數(shù)據(jù)庫中,改值可以修改上傳
android.permission.ACCESS_COARSE_LOCATION
//允許一個(gè)程序訪問CellID或WiFi熱點(diǎn)來獲取粗略的位置
android.permission.ACCESS_FINE_LOCATION
//允許一個(gè)程序訪問精良位置(如GPS)
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
//允許應(yīng)用程序訪問額外的位置提供命令
android.permission.ACCESS_MOCK_LOCATION
//允許程序創(chuàng)建模擬位置提供用于測(cè)試
android.permission.ACCESS_NETWORK_STATE
//允許程序訪問有關(guān)GSM網(wǎng)絡(luò)信息
android.permission.ACCESS_SURFACE_FLINGER
//允許程序使用SurfaceFlinger底層特性
android.permission.ACCESS_WIFI_STATE
//允許程序訪問Wi-Fi網(wǎng)絡(luò)狀態(tài)信息
android.permission.ADD_SYSTEM_SERVICE
//允許程序發(fā)布系統(tǒng)級(jí)服務(wù)
android.permission.BATTERY_STATS
//允許程序更新手機(jī)電池統(tǒng)計(jì)信息
android.permission.BLUETOOTH
//允許程序連接到已配對(duì)的藍(lán)牙設(shè)備
android.permission.BLUETOOTH_ADMIN
//允許程序發(fā)現(xiàn)和配對(duì)藍(lán)牙設(shè)備
android.permission.BRICK
//請(qǐng)求能夠禁用設(shè)備(非常危險(xiǎn)
android.permission.BROADCAST_PACKAGE_REMOVED
//允許程序廣播一個(gè)提示消息在一個(gè)應(yīng)用程序包已經(jīng)移除后
android.permission.BROADCAST_STICKY
//允許一個(gè)程序廣播常用intents
android.permission.CALL_PHONE
//允許一個(gè)程序初始化一個(gè)電話撥號(hào)不需通過撥號(hào)用戶界面需要用戶確認(rèn)
android.permission.CALL_PRIVILEGED
//允許一個(gè)程序撥打任何號(hào)碼,包含緊急號(hào)碼無需通過撥號(hào)用戶界面需要用戶確認(rèn)
android.permission.CAMERA
//請(qǐng)求訪問使用照相設(shè)備
android.permission.CHANGE_COMPONENT_ENABLED_STATE
//允許一個(gè)程序是否改變一個(gè)組件或其他的啟用或禁用
android.permission.CHANGE_CONFIGURATION
//允許一個(gè)程序修改當(dāng)前設(shè)置,如本地化
android.permission.CHANGE_NETWORK_STATE
//允許程序改變網(wǎng)絡(luò)連接狀態(tài)
android.permission.CHANGE_WIFI_STATE
//允許程序改變Wi-Fi連接狀態(tài)
android.permission.CLEAR_APP_CACHE
//允許一個(gè)程序清楚緩存從所有安裝的程序在設(shè)備中
android.permission.CLEAR_APP_USER_DATA
//允許一個(gè)程序清除用戶設(shè)置
android.permission.CONTROL_LOCATION_UPDATES
//允許啟用禁止位置更新提示從無線模塊
android.permission.DELETE_CACHE_FILES
//允許程序刪除緩存文件
android.permission.DELETE_PACKAGES
//允許一個(gè)程序刪除包
android.permission.DEVICE_POWER
//允許訪問底層電源管理
android.permission.DIAGNOSTIC
//允許程序RW診斷資源
android.permission.DISABLE_KEYGUARD
//允許程序禁用鍵盤鎖
android.permission.DUMP
//允許程序返回狀態(tài)抓取信息從系統(tǒng)服務(wù)
android.permission.EXPAND_STATUS_BAR
//允許一個(gè)程序擴(kuò)展收縮在狀態(tài)欄,android開發(fā)網(wǎng)提示應(yīng)該是一個(gè)類似Windows Mobile中的托盤程序
android.permission.FACTORY_TEST
//作為一個(gè)工廠測(cè)試程序,運(yùn)行在root用戶
android.permission.FLASHLIGHT
//訪問閃光燈,android開發(fā)網(wǎng)提示HTC Dream不包含閃光燈
android.permission.FORCE_BACK
//允許程序強(qiáng)行一個(gè)后退操作是否在頂層activities
android.permission.FOTA_UPDATE
//暫時(shí)不了解這是做什么使用的,android開發(fā)網(wǎng)分析可能是一個(gè)預(yù)留權(quán)限.
android.permission.GET_ACCOUNTS
//訪問一個(gè)帳戶列表在Accounts Service中
android.permission.GET_PACKAGE_SIZE
//允許一個(gè)程序獲取任何package占用空間容量
android.permission.GET_TASKS
//允許一個(gè)程序獲取信息有關(guān)當(dāng)前或最近運(yùn)行的任務(wù),一個(gè)縮略的任務(wù)狀態(tài),是否活動(dòng)等等
android.permission.HARDWARE_TEST
//允許訪問硬件
android.permission.INJECT_EVENTS
//允許一個(gè)程序截獲用戶事件如按鍵、觸摸、軌跡球等等到一個(gè)時(shí)間流,android 開發(fā)網(wǎng)提醒算是hook技術(shù)吧
android.permission.INSTALL_PACKAGES
//允許一個(gè)程序安裝packages
android.permission.INTERNAL_SYSTEM_WINDOW
//允許打開窗口使用系統(tǒng)用戶界面
android.permission.INTERNET
//允許程序打開網(wǎng)絡(luò)套接字
android.permission.MANAGE_APP_TOKENS
//允許程序管理(創(chuàng)建、催后、 z- order默認(rèn)向z軸推移)程序引用在窗口管理器中
android.permission.MASTER_CLEAR
//目前還沒有明確的解釋,android開發(fā)網(wǎng)分析可能是清除一切數(shù)據(jù),類似硬格機(jī)
android.permission.MODIFY_AUDIO_SETTINGS
//允許程序修改全局音頻設(shè)置
android.permission.MODIFY_PHONE_STATE
//允許修改話機(jī)狀態(tài),如電源,人機(jī)接口等
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
//允許掛載和反掛載文件系統(tǒng)可移動(dòng)存儲(chǔ)
android.permission.PERSISTENT_ACTIVITY
//允許一個(gè)程序設(shè)置他的activities顯示
android.permission.PROCESS_OUTGOING_CALLS
//允許程序監(jiān)視、修改有關(guān)播出電話
android.permission.READ_CALENDAR
//允許程序讀取用戶日歷數(shù)據(jù)
android.permission.READ_CONTACTS
//允許程序讀取用戶聯(lián)系人數(shù)據(jù)
android.permission.READ_FRAME_BUFFER
//允許程序屏幕波或和更多常規(guī)的訪問幀緩沖數(shù)據(jù)
android.permission.READ_INPUT_STATE
//允許程序返回當(dāng)前按鍵狀態(tài)
android.permission.READ_LOGS
//允許程序讀取底層系統(tǒng)日志文件
android.permission.READ_OWNER_DATA
//允許程序讀取所有者數(shù)據(jù)
android.permission.READ_SMS
//允許程序讀取短信息
android.permission.READ_SYNC_SETTINGS
//允許程序讀取同步設(shè)置
android.permission.READ_SYNC_STATS
//允許程序讀取同步狀態(tài)
android.permission.REBOOT
//請(qǐng)求能夠重新啟動(dòng)設(shè)備
android.permission.RECEIVE_BOOT_COMPLETED
//允許一個(gè)程序接收到
android.permission.RECEIVE_MMS
//允許一個(gè)程序監(jiān)控將收到MMS彩信,記錄或處理
android.permission.RECEIVE_SMS
//允許程序監(jiān)控一個(gè)將收到短信息,記錄或處理
android.permission.RECEIVE_WAP_PUSH
//允許程序監(jiān)控將收到WAP PUSH信息
android.permission.RECORD_AUDIO
//允許程序錄制音頻
android.permission.REORDER_TASKS
//允許程序改變Z軸排列任務(wù)
android.permission.RESTART_PACKAGES
//允許程序重新啟動(dòng)其他程序
android.permission.SEND_SMS
//允許程序發(fā)送SMS短信
android.permission.SET_ACTIVITY_WATCHER
//允許程序監(jiān)控或控制activities已經(jīng)啟動(dòng)全局系統(tǒng)中
android.permission.SET_ALWAYS_FINISH
//允許程序控制是否活動(dòng)間接完成在處于后臺(tái)時(shí)
android.permission.SET_ANIMATION_SCALE
//修改全局信息比例
android.permission.SET_DEBUG_APP
//配置一個(gè)程序用于調(diào)試
android.permission.SET_ORIENTATION
//允許底層訪問設(shè)置屏幕方向和實(shí)際旋轉(zhuǎn)
android.permission.SET_PREFERRED_APPLICATIONS
//允許一個(gè)程序修改列表參數(shù)PackageManager.addPackageToPreferred() 和PackageManager.removePackageFromPreferred()方法
android.permission.SET_PROCESS_FOREGROUND
//允許程序當(dāng)前運(yùn)行程序強(qiáng)行到前臺(tái)
android.permission.SET_PROCESS_LIMIT
//允許設(shè)置最大的運(yùn)行進(jìn)程數(shù)量
android.permission.SET_TIME_ZONE
//允許程序設(shè)置時(shí)間區(qū)域
android.permission.SET_WALLPAPER
//允許程序設(shè)置壁紙
android.permission.SET_WALLPAPER_HINTS
//允許程序設(shè)置壁紙hits
android.permission.SIGNAL_PERSISTENT_PROCESSES
//允許程序請(qǐng)求發(fā)送信號(hào)到所有顯示的進(jìn)程中
android.permission.STATUS_BAR
//允許程序打開、關(guān)閉或禁用狀態(tài)欄及圖標(biāo)Allows an application to open, close, or disable the status bar and its icons.
android.permission.SUBSCRIBED_FEEDS_READ
//允許一個(gè)程序訪問訂閱RSS Feed內(nèi)容提供
android.permission.SUBSCRIBED_FEEDS_WRITE
//系統(tǒng)暫時(shí)保留改設(shè)置,android開發(fā)網(wǎng)認(rèn)為未來版本會(huì)加入該功能。
android.permission.SYSTEM_ALERT_WINDOW
//允許一個(gè)程序打開窗口使用 TYPE_SYSTEM_ALERT,顯示在其他所有程序的頂層(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )
android.permission.VIBRATE
//允許訪問振動(dòng)設(shè)備
android.permission.WAKE_LOCK
//允許使用PowerManager的 WakeLocks保持進(jìn)程在休眠時(shí)從屏幕消失
android.permission.WRITE_APN_SETTINGS
//允許程序?qū)懭階PI設(shè)置
android.permission.WRITE_CALENDAR
//允許一個(gè)程序?qū)懭氲蛔x取用戶日歷數(shù)據(jù)
android.permission.WRITE_CONTACTS
//允許程序?qū)懭氲蛔x取用戶聯(lián)系人數(shù)據(jù)
android.permission.WRITE_GSERVICES
//允許程序修改Google服務(wù)地圖
android.permission.WRITE_OWNER_DATA
//允許一個(gè)程序?qū)懭氲蛔x取所有者數(shù)據(jù)
android.permission.WRITE_SETTINGS
//允許程序讀取或?qū)懭胂到y(tǒng)設(shè)置
android.permission.WRITE_SMS
//允許程序?qū)懚绦?
android.permission.WRITE_SYNC_SETTINGS
//允許程序?qū)懭胪皆O(shè)置
java調(diào)用url的兩種方式
一、在java中調(diào)用url,并打開一個(gè)新的窗口
String url="http://10.58.2.131:8088/spesBiz/test1.jsp";
String cmd = "cmd.exe /c start " + url;
try {
Process proc = Runtime.getRuntime().exec(cmd);
proc.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
}
二、在java中調(diào)用url,后臺(tái)調(diào)用。并取得返回值
URL U = new URL("http://10.58.2.131:8088/spesBiz/test1.jsp");
URLConnection connection = U.openConnection();
connection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine())!= null)
{
result += line;
}
in.close();
http://blog.csdn.net/huangjl2000w/article/details/6338997
先是主程序:
import java.io.BufferedReader;
import java.io.FileReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
public class CheckTomcat {
private static String tomcatroot="";
private static String monitorurl="";
private static void checkTomcatIsAlive(String myurl) throws NullPointerException {
String s;
boolean isTomcatAlive = false;
java.io.BufferedReader in;
try {
System.out.println(">>>>>>檢測(cè)URL:"+myurl);
URL url = new URL(myurl);
URLConnection con = url.openConnection();
in = new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
con.setConnectTimeout(1000);
con.setReadTimeout(4000);
while ((s = in.readLine()) != null) {
if (s.length() > 0) {// 如果能夠讀取到頁面則證明可用,tomcat正常,否則繼續(xù)后面的重啟tomcat操作。
return;
}
}
in.close();
}catch (Exception ex) {
//ex.printStackTrace();
System.out.println("*************該URL有誤或不可訪問!");
}
/*if (isTomcatAlive) {
System.out.println("<" + new Date()+ "> Tomcat is alive but not response!");
stopTomcat();
}*/
RunTomcat runt=new RunTomcat();
runt.startTomcat(tomcatroot);
}
/*public static void stopTomcat() {
try {
//java.lang.Process p = java.lang.Runtime.getRuntime().exec("net stop /"Apache Tomcat/"");
java.lang.Process p = java.lang.Runtime.getRuntime().exec(tomcatroot+"bin//shutdown.bat");
java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String s;
String t = "Using JRE_HOME";
boolean restart = false;
while ((s = in.readLine()) != null) {
if (s.indexOf(t) != -1) {
restart = true;
break;
}
}
System.out.println("<" + new Date() + "> Tomcat is stop "+ (restart ? "OK" : "ERROR"));
} catch (Exception e) {
e.printStackTrace();
}
}*/
public static void main(String[] args) {
System.out.println("********************************************************");
System.out.println("====本程序自動(dòng)檢測(cè)Tomcat運(yùn)行狀況,必要時(shí)自動(dòng)重啟Tomcat。====");
System.out.println("********************************************************");
init_config();
if(monitorurl.equals(""))monitorurl="http://localhost:8080/ExchangeWeb/checkTomcat/monitor.jsp";
if(tomcatroot.equals(""))tomcatroot="F://tomcat-6.0.20//";
if(!tomcatroot.endsWith("//"))tomcatroot+="http://";
while (true) {
try {
String random="?random="+Math.random() * 65535;//=====處理數(shù)據(jù)緩存問題======
CheckTomcat.checkTomcatIsAlive(monitorurl+random);
Thread.sleep(5000);
System.out.println("========================checking at <"+new Date()+">");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
static private void init_config() {
try{
CheckTomcat me=new CheckTomcat();
String maindir=me.getClass().getResource("/").toURI().getPath();
System.out.println(">>>>>>配置文件目錄:"+maindir);
String sLine;
String filename=maindir+"config.xml";
BufferedReader buffReader = new BufferedReader(new FileReader(filename));
while((sLine = buffReader.readLine())!=null)
{
sLine = sLine.trim();
if(sLine.trim()!="" && !sLine.equals("")){
if(sLine.toLowerCase().startsWith("tomcatroot")){
int npos=sLine.indexOf("tomcatroot");
npos+="tomcatroot".length();
tomcatroot=sLine.substring(npos).trim();
if(tomcatroot.startsWith("="))tomcatroot=tomcatroot.substring(1);
}
else if(sLine.toLowerCase().startsWith("monitorurl")){
int npos=sLine.indexOf("monitorurl");
npos+="monitorurl".length();
monitorurl=sLine.substring(npos).trim();
if(monitorurl.startsWith("="))monitorurl=monitorurl.substring(1);
}
}
}
buffReader=null;
}catch(Exception e){
e.printStackTrace();
System.out.println("********************************************************");
System.out.println("====讀取配置文件失敗!系統(tǒng)無法運(yùn)行,請(qǐng)與供應(yīng)商聯(lián)系。====");
System.out.println("********************************************************");
System.exit(0);
}
}
}
再是自動(dòng)重啟Tomcat線程類:
import java.util.Date;
public class RunTomcat extends Thread {
private static String tomcatroot="";
public void startTomcat(String root) {
this.tomcatroot=root;
System.out.println(">>>>>>Tomcat即將啟動(dòng)。。。");
System.out.println(">>>>>>Tomcat根目錄:"+tomcatroot);
try {
//java.lang.Process p = java.lang.Runtime.getRuntime().exec("net stop /"Apache Tomcat/"");
java.lang.Process p = java.lang.Runtime.getRuntime().exec(tomcatroot+"bin//shutdown.bat");
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(3000);//等待shutdown結(jié)束
//RunTomcat me=new RunTomcat();
//String maindir=me.getClass().getResource("/").toURI().getPath();
//java.lang.Process p = java.lang.Runtime.getRuntime().exec(maindir+"checkTomcat.bat");
java.lang.Process p = java.lang.Runtime.getRuntime().exec(tomcatroot+"bin//startup.bat");
java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
/*String s;
boolean restart = false;
String t = "Server startup in";
while ((s = in.readLine()) != null) {
System.out.println(s);
if (s.indexOf(t) != -1) {
restart = true;
break;
}
}*/
System.out.println(">>>>>>Tomcat start at <" + new Date() + ">");
} catch (Exception e) {
e.printStackTrace();
}
}
}
接著是檢測(cè)tomcat是否活動(dòng)monitor.jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
out.println("path=" + path + "<br>");
out.println("basePath=" + basePath + "<br>");
out.println("ok<br>");
%>
然后是config.xml配置文件:
tomcatroot=F:/tomcat-6.0.20/
monitorurl=http://localhost:8080/ExchangeWeb/checkTomcat/monitor.jsp
最后是checkTomcat.bat批處理文件:
@echo off
rem=========第一步:配置下面的JAVA_HOME為JDK目錄==========#
@set JAVA_HOME=C:/Program Files/Java/jdk1.6.0_14
rem=========第二步:配置下面的CATALINA_HOME為Tomcat目錄==========#
@set CATALINA_HOME=F:/tomcat-6.0.20
@set PATH=%JAVA_HOME%/bin/;
@set CLASSPATH=%JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar;%CATALINA_HOME%/lib/servlet-api.jar;%CATALINA_HOME%/lib/jsp-api.jar;
java CheckTomcat
測(cè)試時(shí),只要雙擊執(zhí)行checkTomcat.bat文件即可。