1. 什么是尋址空間
尋址空間一般指的是CPU對于內存尋址的能力。通俗地說,就是能最多用到多少內存的一個問題
2. 我們經常聽說32位操作系統最多能用4G內存。大部分情況下,這個上限都達不到。例如我的機器,雖然是4G物理內存,但實際上識別的只有3G。有的朋友說是可以識別到3.2G或者3.5G不等,我想這跟人品是沒有什么關系的
那么,這剩下的1個G左右的內存不是浪費了嗎?可不是嘛,太心痛了。所有很多朋友都用一個軟件將這部分內存轉換為硬盤用
http://blog.miniasp.com/post/2008/04/Useful-tools-Gavotte-Ramdisk.aspx
【備注】我自己還沒有這么用,要想試用該功能的同學,自己需要慎重。如果你用的好,記得反饋一下給我,呵呵
3. 為什么說只能尋址到這個大小呢?我今天是要從程序的角度來解說一下
首先說什么是32位?32位是針對CPU的一個術語
對于程序員來說,這表示了我們在與計算機打交道的時候,能夠使用的最大數字是2的32次方。這等于多少呢?
那么這個數字是什么為單位呢?bit ,也可以稱為比特,或者位。這是計算機可以理解的東西。這個bit里面包含的值,只有兩個,就是0和1
好了,那么這個bit怎么樣能轉換為GB呢,很簡單:將它連續除以3次1024.
4294967296/1024/1024/1024
結果等于多少呢?
為什么除3次?第一次轉換為KB,第二次轉換為MB,第三次就轉換為GB了
4. 那么64位的CPU的尋址空間可以到多大呢?
我算一算,可以到多少GB呢?
額的神啊,根據摩爾定律的計算,我想我的有生之年是不需要擔心內存不夠用的問題的
posted @
2011-07-05 12:16 David1228 閱讀(610) |
評論 (0) |
編輯 收藏
Iptables
感覺防火墻可能不能完美的保護主機,比如ping措施,這時,就需要使用iptables來進行配置。
使用Iptables的內置firewall機制,是通過kernel中的netfilter 模塊實現的,Linux kernel使用netfilter對進出數據包進行過濾,netfilter由三個規則表組成,每個表又有許多內建的鏈組成。使用iptables命令可以對這些表鏈進行操作,如添加、刪除、列出規則等。
Netfilter 規則表 --- filter nat managle
filter用于路由網絡數據包。是默認的,也就是說如果沒有指定-t參數,當創建一條新規則時,他默認存放到該表內。
INPUT 網絡數據包流向服務器
OUTPUT 網絡數據包從服務器流出
FORWARD 網絡數據包經服務器路由
nat 用于NAT表 Net Address Translation 是一種IP地址轉換方法
PREROUTING 網絡數據包到達服務器時可以被修改
POSTROUTING 網絡數據包在即將從服務器發出時可以被修改
managle 用于修改網絡數據包的表
配置iptables
當數據包進入服務器時,Linux kernel會查找對應的鏈,直到找到一條規則與數據包匹配。如果該規則的target是ACCEPT,就會跳過剩下的規則,數據包會繼續被傳送。如果該規則target是DROP,該數據包會被攔截掉,kernel不會在參考其他規則。
Note:如果從始至終都沒有一條規則與數據包匹配,而且表末尾有沒有drop all規則,那么該數據包會被accept。Cisco則相反,在表末尾會因含deny all的規則。
1) iptables命令選項
iptables [-t iptables ] command option parameter target
-A 在鏈尾添加一條規則
-C 將規則添加到用戶定義鏈之前對其進行檢查
-D 從鏈中刪除一條規則
-E重命名用戶定義的鏈,不改變鏈本身
-F 清空鏈,刪除鏈上的所有規則
-I在鏈中插入一條規則
-L 列出某個鏈上的規則,如:iptables –L INPUT 列出INPUT鏈上的規則
-N 創建一個新鏈
-P 定義某個鏈的默認策略
-R替換鏈上的某條規則
-X 刪除某個用戶相關的鏈
-Z 將所有表的所有鏈的字節和數據包統計數器清零
2) Iptables的命令參數
-p protocol
應用于數據包的協議類型,可以是TCP UDP ICMP 或 ALL ! 也可以
當使用-p tcp時,還可使用其他可選項,一邊允許進一步定義規則,選項如下:
-sport 允許指定匹配數據包源端口 port1:port2表示port1和port2之間的所有端口
-dport目的端口,和sport雷同
當使用-p !udp 時,也有特殊的選項供使用
-sport和-dport與-p tcp相同,只不過用于UDP包
使用-p icmp參數時,只有一個選項可用
-icmp-type 允許在過濾規則中指定icmp類型
-s source 指定數據包包的源地址,該參數后跟一個IP地址,一個帶有sub-net mask的網絡地址,或者一個主機名(不建議使用主機名)
-d destination 數據包的目的地址 同-s
-j jump 用于指定一個target,告訴規則將該匹配的數據包發送到該target。Target可以是ACCEPT,DROP,QUEIE,PETURN。如果沒有-j,那么不會對數據包進行任何操作,只是將計數器加1
-I in-interface 對于INPUT FOREARD PREROUTING鏈,指定數據包到達服務器時所使用的端口
-o out-interface 對于OUTPUT FORWARD POSTROUTING鏈,該參數指定數據包離開服務器時使用的端口
3)Iptables的命令target
創建規則最后一步是指定iptables對數據包的操作。只要某一規則匹配該數據包,就不會再有別的規則的操作。內建的target有:ACCEPT 允許數據包通過 ,到達目的地
DROP 拒絕數據包通過,丟棄該包
QUEUE 將數據包發送回到用戶應用程序處理
RETURN 不再根據當前鏈的其他規則來檢查數據包,而是直接返回,繼續被發送到其目的地址,或下一個鏈。
2、示例:
允許www
Iptables –A INPUT –p tcp –dport 80 –j ACCEPT
該規則被調價到filter表的INPUT鏈,允許目的端口為80的數據包通過
在內部接口上允許DHCP
Iptables –A INPUT –I eth0 –p tcp - - sport - - dport 67 ACCEPT
Iptables –A INPUT –I eth0 –p udp - - sport - - dport 67 ACCEPT
同時允許tcp和udp協議
3、保存和修改iptables
使用iptables-save 可將現行的iptables規則保存
恢復iptables
使用iptables-restore可從配置文檔恢復iptables表到現行iptables表。
posted @
2011-06-30 18:59 David1228 閱讀(394) |
評論 (0) |
編輯 收藏
我在本地將10G文件打包為zip,上傳到linux下。之前所用的unzip解壓不了這么大的文件。
[root@node30 images]# unzip ubuntu-8.04.4.zip Archive: ubuntu-8.04.4.zip skipping: ubuntu-8.04.4.img need PK compat. v4.5 (can do v2.1)網上找到解決方案通過p7zip工具能夠實現大文件的解壓縮。p7zip簡介看最下面。
然后再官方網站:http://p7zip.sourceforge.net/ 中下載了針對linux的p7zip
下載之后后綴名是
p7zip_9.20.1_src_all.tar.bz2,
通過命令
tar -jxvf p7zip_9.20.1_src_all.tar.bz2 解壓該文件,
然后執行
make 編譯
在執行
make install 安裝p7zip
OK?。。。?br />執行如下命令即可完成我這10G文件的解壓縮。如下:
[root@node30 images]# 7za x ubuntu-8.04.4.zip 7-Zip (A) [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,4 CPUs)Processing archive: ubuntu-8.04.4.zipExtracting ubuntu-8.04.4.imgEverything is OkSize: 10737418240Compressed: 117455645以下為網上轉載回顧之用。
轉載自:
http://www.cnblogs.com/fangbo/archive/2009/12/01/1614538.html
這么多年來,數據壓縮對我們來說是非常有用的。無論是在郵件中發送的圖片用的zip文件 還是在服務器壓縮數據文件,我們都可以讓下載更容易或者有效的節約磁盤空間。某些壓縮格式有時允許我們以60%的比率(甚至更高)壓縮文件。下面我將會給 大家演示如何用這些命令在Linux下面去壓縮文件或者目錄。我們將學習zip, tar, tar.gz和tar.bz2等壓縮格式的基本用法。這幾個是在Linux里面常用的壓縮格式。
在我們探究這些用法之前,我想先跟大家分享一下使用不同壓縮格式的經驗。當然,我這里講到的只是其中的一些用法,除我講到的之外,他們還有更多的地 方值得我們探討。我已經意識到我需要了解兩到三種壓縮格式,才能更好的使用他們。zip格式是第一個需要了解的格式。因為它實際上已成為壓縮文件的標準選 擇,而且它在windows上也能使用。我經常用zip格式壓縮那些需要共享給windows用戶的文件。如果只是共享給linux用戶或者Mac用戶, 那我偏向于選擇tar.gz格式。
ZIP
zip可能是目前使用得最多的文檔壓縮格式。它最大的優點就是在不同的操作系統平臺,比如Linux, Windows以及Mac OS,上使用。缺點就是支持的壓縮率不是很高,而tar.gz和tar.gz2在壓縮率方面做得非常好。閑話少說,我們步入正題吧:
我們可以使用下列的命令壓縮一個目錄:
# zip -r archive_name.zip directory_to_compress
下面是如果解壓一個zip文檔:
TAR
Tar是在Linux中使用得非常廣泛的文檔打包格式。它的好處就是它只消耗非常少的CPU以及時間去打包文件,他僅僅只是一個打包工具,并不負責壓縮。下面是如何打包一個目錄:
# tar -cvf archive_name.tar directory_to_compress
如何解包:
# tar -xvf archive_name.tar.gz
上面這個解包命令將會將文檔解開在當前目錄下面。當然,你也可以用這個命令來捏住解包的路徑:
# tar -xvf archive_name.tar -C /tmp/extract_here/
TAR.GZ
這種格式是我使用得最多的壓縮格式。它在壓縮時不會占用太多CPU的,而且可以得到一個非常理想的壓縮率。使用下面這種格式去壓縮一個目錄:
# tar -zcvf archive_name.tar.gz directory_to_compress
解壓縮:
# tar -zxvf archive_name.tar.gz
上面這個解包命令將會將文檔解開在當前目錄下面。當然,你也可以用這個命令來捏住解包的路徑:
# tar -zxvf archive_name.tar.gz -C /tmp/extract_here/
TAR.BZ2
這種壓縮格式是我們提到的所有方式中壓縮率最好的。當然,這也就意味著,它比前面的方式要占用更多的CPU與時間。這個就是你如何使用tar.bz2進行壓縮。
# tar -jcvf archive_name.tar.bz2 directory_to_compress
上面這個解包命令將會將文檔解開在當前目錄下面。當然,你也可以用這個命令來捏住解包的路徑:
# tar -jxvf archive_name.tar.bz2 -C /tmp/extract_here/
數據壓縮是非常有用的,尤其是對于備份來說。所以,你現在應該考慮在你的備份腳本中使用你在這里學到的壓縮方式備份你基本的規則文件以減小你備份文件的大小。
過段時間之后,你就會意識到,在壓縮率與CPU占用時間上會有一個平衡,你也要學會如何去權衡什么時候你需要一個快但是壓縮率低,什么時候需要一個壓縮率高但是CPU點用高的壓縮方式,然后你才能避免無謂的空間與時間。
-Zip 是一種高壓縮比的存檔格式 7z 的管理器,可惜只能用于 Windows 平臺。其實7-zip也有linux版本的,只不過它不叫7-zip了,而是P7ZIP。
P7ZIP 的安裝
在 Debian/Ubuntu 系統,可通過 sudo apt-get install p7zip 進行安裝。
也可以從這里下載:http://p7zip.sourceforge.net/
P7ZIP 的使用
創建壓縮包:7za a -t7z test.7z *,此命令將目錄中的所有文件壓縮到 test.7z 中。
解開壓縮包:7za X test.7z,此命令用于將 test.7z 中的文件提取出來??墒褂?-t 來指明壓縮格式。
更多信息,執行命令:
7za –help
另外,解壓文件建議用 X 而不是 e
7za X test.7z
用 e 會丟失目錄結構的。
相關鏈接:
官方網站:http://p7zip.sourceforge.net/
論壇支持:http://sourceforge.net/forum/?group_id=111810
posted @
2011-06-22 12:15 David1228 閱讀(1578) |
評論 (0) |
編輯 收藏
摘要: 最近通過做的項目中修改個bug,在jsp頁面中潛入applet,通過applet來上傳5-10G之間的文件。修改過程記錄如下:JSP頁面中 <div id="appletTemp"> &nb...
閱讀全文
posted @
2011-06-21 15:07 David1228 閱讀(2256) |
評論 (0) |
編輯 收藏
HTML5高級程序設計思想,歡迎學習哦!
/Files/ldwblog/解讀_HTML5.pdf
posted @
2011-06-02 14:26 David1228 閱讀(278) |
評論 (0) |
編輯 收藏
lsof -i:3306
查看3306端口被誰占用
lsof簡介
lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接 和硬件。所以如傳輸控制協議 (tcp) 和用戶數據報協議 (udp) 套接字等,系統在后臺都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因 為應用程序打開文件的描述符列表提供了大量關于這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。
lsof使用
lsof輸出信息含義
在終端下輸入lsof即可顯示系統打開的文件,因為 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。
command pid user fd type device size node name
init 1 root cwd dir 3,3 1024 2 /
init 1 root rtd dir 3,3 1024 2 /
init 1 root txt reg 3,3 38432 1763452 /sbin/init
init 1 root mem reg 3,3 106114 1091620 /lib/libdl-2.6.so
init 1 root mem reg 3,3 7560696 1091614 /lib/libc-2.6.so
init 1 root mem reg 3,3 79460 1091669 /lib/libselinux.so.1
init 1 root mem reg 3,3 223280 1091668 /lib/libsepol.so.1
init 1 root mem reg 3,3 564136 1091607 /lib/ld-2.6.so
init 1 root 10u fifo 0,15 1309 /dev/initctl
每行顯示一個打開的文件,若不指定條件默認將顯示所有進程打開的所有文件。lsof輸出各列信息的意義如下:
command:進程的名稱
pid:進程標識符
user:進程所有者
fd:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
type:文件類型,如dir、reg等
device:指定磁盤的名稱
size:文件的大小
node:索引節點(文件在磁盤上的標識)
name:打開文件的確切名稱
其中fd 列中的文件描述符cwd 值表示應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改。
txt 類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序。其次數值表示應用
程序的文件描述符,這是打開該文件時返回的一個整數。如上的最后一行文件/dev/initctl,其文件描述符為 10。u 表示該
文件被打開并處于讀取/寫入模式,而不是只讀 ? 或只寫 (w) 模式。同時還有大寫 的w 表示該應用程序具有對整個文件的寫
鎖。該文件描述符用于確保每次只能打開一個應用程序實例。初始打開每個應用程序時,都具有三個文件描述符,從 0 到 2,
分別表示標準輸入、輸出和錯誤流。所以大多數應用程序所打開的文件的 fd 都是從 3 開始。
與 fd 列相比,type 列則比較直觀。文件和目錄分別稱為 reg 和 dir。而chr 和 blk,分別表示字符和塊設備;
或者 unix、fifo 和 ipv4,分別表示 unix 域套接字、先進先出 (fifo) 隊列和網際協議 (ip) 套接字。
posted @
2011-06-02 11:12 David1228 閱讀(323) |
評論 (0) |
編輯 收藏
/Files/ldwblog/Xen管理手冊.pdf 1. XEN Virtual Machine Migration
來自http://www.novell.com/
XEN遷移/保存/掛起都要保存虛擬機狀態快照,只要對于該虛擬機的memory、deviceI/O states、network connecitions and the contents of the virtual CPU registers.XEN有能力來保存所有這些信息到一個磁盤中,然后再所遷移的節點上重啟該虛擬機。
1、 SAVE & RESTORE MIGRATION
當你保存或掛起虛擬機時,對應的虛擬機資源不會再分配著,會返回給domain0(host server)。這些資源會被節點上運行著的虛擬機所使用。也就意味著保存或掛起的虛擬機的網絡連接同樣也丟失了。
虛擬機保存和恢復功能可以被用于很多用途包括測試、調試、遷移虛擬機、系統崩潰快速恢復。例如如果一個虛擬機宕機了,可以快速恢復到一個已知的工作狀態。
熱遷移:xm migrate
1、 首先檢查目的服務器上是否有足夠的資源來運行指定的虛擬機。
2、 執行虛擬機內存的初始拷貝,并將其傳輸到目的地服務器。
3、 每次連續迭代,初始拷貝之后,只有內存在內傳輸到目的地服務器過度中是變化的。
4、 當內存頁變化足夠低時或者剩余的頁數傳輸并沒有漸減當隨著虛擬機被傳輸到目的地服務器最終的狀態時。
5、 虛擬機控制器被傳輸到指定的主機服務器上。
你的環境中實現熱遷移需檢查如下:
1、 對于遷移兩個XEN主機服務器的之間需正確的被配置。
2、 兩個主機之間要有一個快速穩定的網絡連接,兩個服務器都必須在相同的第2層網絡和IP子網,這樣準許網絡連接遷移到虛擬機。
3、 兩個主機服務器通過共享存儲方式來訪問,強烈推薦指定虛擬機的磁盤鏡像和配置文件要放到共享存儲。
4、 在兩臺主機之間XEN版本相同。
對于遷移工作,現在執行一些初始設置。
1、 Edit xend the configuration file
Xend-config.sxp是主要的配置文件對于XEN daemon(XEN守護進程)
Using a text editor such as vi or gedit open /etc/xen/xend-config.sxp.
詳細檢查該文件,確認下面這行沒有被注釋掉。
設置如下所示的值
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address ‘’)
(xend-relocation-hosts-allow ‘’)
The xend-relocation-address操作允許你指定IP地址,XEN daemon監聽遷移請求,保留空白設置表示讓該服務器監聽所有端口,The xend-relocation-hosts-allow 允許選項,限制哪些主機可以聯系遷移請求的服務器,理想情況下你應該限制對服務器的訪問,使用該選項,以提供更好的安全性。
如果你的運行的服務器開放了防火墻,則你要確保你網卡指定IP上的8002端口被打開。
2、 Migrate a virtual machine
遷移虛擬機格式是非常簡單的,xm migrate DomainId destHostID
Eg: xm migrate 1 10.0.0.56
可以在目的地服務器上執行xm list確認主機是否成功被遷移。
正規執行遷移命令是不帶任何參數的,xm migrate
我們可以添加-live 選項執行遷移操作,xm migrate –live 1 10.0.0.56,此時是用的熱方法,很好的測試方式是通過ping 虛擬機的IP地址,看看有多少包丟失了。
posted @
2011-05-19 11:14 David1228 閱讀(1403) |
評論 (0) |
編輯 收藏
下載
附錄常用shell命令
本附錄中列舉了一些有用的s h e l l命令。這里并沒有完全列出每個命令的各種選項,不過
對于理解該命令是足夠了。
這些命令的其他一些例子散布于本書的各個部分。
basename
格式:
basename path
b a s e n a m e命令能夠從路徑中分離出文件名。通常用于s h e l l腳本中,請看下面的例子:
如果上面的語句是腳本m y s c r i p t中的一部分,那么它的輸出應為:
myscript: give me a file
其中,$ 0是一個包含當前腳本全路徑的特殊變量。
cat
格式:
cat options files
選項:
- v:顯示控制字符。
c a t是最常用的文本文件顯示命令。
$ cat myfile
上面的命令用于顯示m y f i l e文件。
$ cat myfile myfile2 >>hold_file
上面的命令把兩個文件( m y f i l e和m y f i l e 2 )合并到h o l d f i l e中。
在腳本中c a t命令還可以用于讀入文件。
compress
格式:
compress options files
選項:
- v:顯示壓縮結果。
c o m p r e s s命令可以用來壓縮文件。壓縮后的文件名具有‘ . Z’后綴。還可以使用該命令解
壓文件。
cp
格式:
cp options file1 file2
選項:
- i:在覆蓋文件之前提示用戶,由用戶確認。
- p:保留權限模式和更改時間。
- r:拷貝相應的目錄及其子目錄。
要將文件m y f i l e拷貝到m y f i l e 1 . b a k,使用:
$ cp myfile1 myfile1.bak
要將文件g e t . p r d從/ u s r / l o c a l / s y b i n目錄拷貝到/ u s r / l o c a l / b i n目錄,使用:
要將/ l o g s目錄下的所有文件及子目錄拷貝到/ h o l d / l o g s目錄中,使用:
$ cp -r /logs /hold/logs
diff
格式:
diff options file1 file2
選項:
- c:按照標準格式輸出(見下面的例子)。
- I:忽略大小寫。
我們使用c o m m命令中的例子,d i ff命令將顯示兩個文件中不一致的行。
d i ff命令顯示出兩個文件中的第2行和第3行,它們的第3列不一致。
dircmp
格式:
附錄常用s h e l l命令351
下載
dircmp options directory1 directory2
選項:
- s:不顯示相同的文件。
d i r c m p命令與d i ff命令十分相似—它比較并顯示兩個目錄中的不同。
dirname
格式:
dirname pathname
該目錄正好和b a s e n a m e相反,它返回路徑部分:
du
格式:
du options directory
選項:
- a:顯示每個文件的大小,不僅是整個目錄所占用的空間。
- s:只顯示總計。
d u顯示的磁盤空間占用是以5 1 2字節的塊來表示的。它主要用于顯示目錄所占用的空間。
在本例中, / v a r目錄所占用的空間為1 4 9 2 9塊(每塊5 1 2字節)。
file
格式:
file filename
該命令用來確定文件的類型。
fuser
格式:
fuser options file
選項:
- k:殺死所有訪問該文件或文件系統的進程。
352 附錄常用s h e l l命令
下載
- u:顯示訪問該文件或文件系統的所有進程。
f u s e r命令可以顯示訪問某個文件或文件系統的所有進程。在有些系統上- u和- m選項可以
互換。還可以在i f語句中使用f u s e r命令。
要列出設備/ d e v / h d a 5上的所有活動進程,使用:
要殺死設備/ d e v / h d a 5上的所有進程,使用:
$ fuser -k /dev/hda5
要查看d o c p a r t文件是否被打開,有哪些進程在使用,可用:
有些系統上的f u s e r命令能夠在列表中顯示用戶登錄I D。如果你的系統不具有這樣的功能,
可以按照f u s e r命令輸出中末尾含有‘ e’的數字在ps -ef或ps xa命令的輸出中用g r e p命令查找
相應的用戶登錄I D。
head
格式:
head -number files
h e a d命令可以顯示相應文件的前1 0行。如果希望指定顯示的行數,可以使用- n u m b e r選項。
例如:
$ head -1 myfile
只顯示文件的第一行,而
$ head -30 logfile |more
則顯示l o g f i l e文件的前3 0行。
logname
格式:
l o g n a m e
該命令可以顯示當前所使用的登錄用戶名:
mkdir
格式:
mkdir options directory
選項:
附錄常用s h e l l命令353
下載
- m:在創建目錄時按照該選項的值設置訪問權限。
上述命令創建了一個名為H O L D A R E A的目錄。
more
格式:
more options files
該命令和p a g e及p g命令的功能相似,都能夠分屏顯示文件內容。
選項:
- c:不滾屏,而是通過覆蓋來換頁。
- d:在分頁處顯示提示。
- n:每屏顯示n行。
$ more /etc/passwd
上面的命令顯示p a s s w d文件
$ cat logfile |more
上面的命令顯示l o g f i l e文件。
nl
格式:
nl options file
選項:
- I:行號每次增加n;缺省為1。
- p:在新的一頁不重新計數。
n l命令可用于在文件中列行號,在打印源代碼或列日志文件時很有用。
$ nl myscript
上面的命令將列出m y s c r i p t文件的行號。
$ nl myscript >hold_file
則將上面命令的輸出重定向到h o l d f i l e文件中。
$ nl myscript | lpr
將上面命令的結果重定向到打印機。
printf
格式:
printf format arguments
該命令有點類似于a w k命令的p r i n t f函數,它將格式化文本送至標準輸出。
其中,格式符f o r m a t包含三種類型的項,這里我們只討論格式符:
%[- +]m.nx
354 附錄常用s h e l l命令
下載
其中橫杠-為從行首算起的起始位置。一般說來m表示域的寬度而n表示域的最大寬度。
‘%’后面可跟下列格式字符:
s:字符串。
c:字符。
d:數字。
x:1 6進制數。
o:1 0進制數。
p r i n t f命令本身并不會產生換行符,必須使用轉義字符來實現這樣的功能。下面是最常用
的轉義字符:
\ a:響鈴。
\ b:退格。
\ r:回車。
\ f:換頁。
\ n:換行。
\ t:跳格。
$ printf "Howzat!\n"
H o w z a t !
上面的命令輸出了一個字符串,使用\ n來換行。
上面的命令把1 6進制值轉換為A S C I I字符+。
上面的命令從左起第1 0個字符的位置開始顯示字符串。
pwd
格式:
p w d
顯示當前的工作目錄,可以用:
在上面的腳本中,使用了命令置換來獲得當前目錄。
rm
格式:
rm options files
選項:
附錄常用s h e l l命令355
下載
- i:在刪除文件之前給出提示(安全模式)。
- r:刪除目錄。
r m命令能夠刪除文件或目錄。
上面的第二條命令能夠刪除/ v a r / s p o o l / t m p目錄下的所有文件及子目錄。
rmdir
格式:
rmdir options directory
選項:
- p:如果相應的目錄為空目錄,則刪除該目錄。
$ rmdir /var/spool/tmp/lp_HP
上面的命令將刪除/ v a r / s p o o l / t m p目錄下的l p H P目錄。
script
格式:
script option file
- a:將輸出附加在文件末尾。
可以使用s c r i p t命令記錄當前會話。只要在命令行鍵入該命令即可。該命令在你退出當前
會話時結束。它可以將你的輸入記錄下來并附加到一個文件末尾。
$ script mylogin
將會啟動s c r i p t命令并將所有會話內容記錄在m y l o g i n文件中。
shutdown
格式:
s h u t d o w n
該命令將關閉系統。很多系統供應商都有自己特定的命令變體。
$ shutdown now
上面的命令將會立即關機。
$ shutdown -g60 -I6 -y
上面的命令將會在6 0秒之后關機,然后重新啟動系統。
sleep
格式:
sleep number
該命令使系統等待相應的秒數。例如:
356 附錄常用s h e l l命令
下載
$ sleep 10
意味著系統在1 0秒鐘之內不進行任何操作。
strings
格式:
strings filename
該命令可以看二進制文件中所包含的文本。
touch
格式:
touch options filename
選項:
-t MMDDhhmm 創建一個具有相應月、日、時分時間戳的文件。
下面的命令能夠以當前時間創建文件或更新已有文件的時間戳。
上面的命令以當前時間創建了一個名為m y f i l e的文件。
上面的命令以時間戳6月1 0日上午9 : 3 0創建了一個名為m y f i l e 2的空文件。
tty
格式:
t t y
可以使用t t y來報告所連接的設備或終端。
可以使用tty -s命令來確定腳本的標準輸入。返回碼為:
0:終端。
1:非終端。
uname
格式:
uname options
選項:
- a:顯示所有信息。
- s:系統名。
- v:只顯示操作系統版本或其發布日期。
附錄常用s h e l l命令357
下載
要顯示當前操作系統名及其他相關信息,可以用:
uncompress
格式:
uncompress files
可以使用該命令來恢復壓縮文件。
$ uncompress myfile
上面的命令解壓縮先前壓縮的m y f i l e文件。注意,在解壓縮時不必給出. Z后綴。
wait
格式:
wait process ID
該命令可以用來等待進程號為process ID的進程或所有的后臺進程結束后,再執行當前腳
本。
下面的命令等待進程號為1 2 9 9的進程結束后再執行當前腳本:
$ wait 1299
下面的命令等待所有的后臺進程結束后再執行當前腳本:
$ wait
wc
格式:
wc options file。s
選項:
- c:顯示字符數。
- l:顯示行數。
- w:顯示單詞數。
該命令能夠統計文件中的字符數、單詞數和行數。
在上面第一個例子中, w h o命令的輸出通過管道傳遞給w c命令,該命令顯示出如下的幾
列:
行數、單詞數、字符數
在上面的第二個例子中, w c命令只顯示文件中所包含的行數。
358 附錄常用s h e l l命令
下載
上面的腳本顯示出變量VA R中所包含的字符串的長度。
whereis
格式:
whereis command_name
w h e r e i s命令能夠給出系統命令的二進制文件及其在線手冊的路徑。
注意,在下面的例子中, w h e r e i s命令沒有顯示出相應命令的二進制文件路徑,因為它們
是內建的s h e l l腳本,但是該命令給出了其在線手冊的路徑。
who
格式:
who options
選項:
- a:顯示所有的結果。
- r:顯示當前的運行級別(在L I N U X系統中應當使用r u n l e v e l命令)。
- s:列出用戶名及時間域。
whoami 顯示執行該命令的用戶名。這不是w h o命令的一個選項,可以單獨應用。
w h o命令可以顯示當前有哪些用戶登錄到系統上。要顯示當前登錄的用戶,可以用:
要顯示自己的用戶名,可以用:
附錄常用s h e l l命令359
下載
posted @
2011-05-17 10:11 David1228 閱讀(314) |
評論 (0) |
編輯 收藏
軟件系統的并發控制一般是通過加鎖(有樂觀鎖和悲觀鎖兩種)來實現,樂觀鎖是一種事后補救措施,是通過程序的邏輯控制版本來實現的,而悲觀鎖是事前的一種預防措施,它利用數據庫的鎖機制來實現。
雖然樂觀鎖能夠提高系統的性能,但它是對發生沖突的訪問進行事后的補救,應用在用戶輸入數據量很少的場合比較適合,但如果在企業ERP,用戶與系統交互涉及大量數據在頁面表單上錄入,如果事后提交失敗后才提示用戶要重新錄入是很不現實的,所以有必要進行事前控制,這就要采用悲觀鎖。
在多個客戶端可能讀取同一筆數據或同時更新一筆數據的情況下,防止同一個數據被修改而造成混亂,最簡單的手段就是在讀取時對數據進行鎖定,其它客戶端不能對同一筆數據進行更新的讀取動作。
一個典型的倚賴數據庫的悲觀鎖調用:
select * from account where name=”John” for update
這條 sql 語句鎖定了 account 表中所有符合檢索條件(name=”Erica”)的記錄。本次事務提交之前(事務提交時會釋放事務過程中的鎖),外界無法修改這些記錄。Hibernate 的悲觀鎖,也是基于數據庫的鎖機制實現。
下面的代碼實現了對查詢記錄的加鎖:
String hqlStr ="from TUser as user where user.name='John'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); // 加鎖
List userList = query.list();// 執行查詢,獲取數據
query.setLockMode 對查詢語句中,特定別名所對應的記錄進行加鎖(我們為TUser 類指定了一個別名 “user” ),這里也就是對返回的所有 user 記錄進行加鎖。
觀察運行期 Hibernate 生成的 SQL 語句:
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name='John' ) for update
這里 Hibernate 通過使用數據庫的 for update 子句實現了悲觀鎖機制。
Hibernate 的加鎖模式有:
LockMode.NONE : 無鎖機制。
LockMode.WRITE : Hibernate 在 Insert 和 Update 記錄的時候會自動獲取。
LockMode.READ : Hibernate 在讀取記錄的時候會自動獲取。
以上這三種鎖機制一般由 Hibernate 內部使用,如 Hibernate 為了保證 Update過程中對象不會被外界修改,會在 save 方法實現中自動為目標對象加上 WRITE 鎖。
LockMode.UPGRADE :利用數據庫的 for update 子句加鎖。
LockMode. UPGRADE_NOWAIT : Oracle 的特定實現,利用 Oracle 的 for update nowait 子句實現加鎖。
上面這兩種鎖機制是我們在應用層較為常用的,加鎖一般通過以下方法實現:
Criteria.setLockMode
Query.setLockMode
Session.lock
注意,只有在查詢開始之前(也就是 Hiberate 生成 SQL 之前)設定加鎖,才會真正通過數據庫的鎖機制進行加鎖處理,否則,數據已經通過不包含 for update 子句的 Select SQL 加載進來,所謂數據庫加鎖也就無從談起。
posted @
2011-03-17 16:03 David1228 閱讀(496) |
評論 (0) |
編輯 收藏
package com.sinovatech.unicom.efb.common;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
/**
*
* 目的:FTP文件類
* <br/>
*
* FTP上傳文件、下載文件
*
* *
*/
public class FTPUtil {
private static final Log log = LogFactory.getLog(FTPUtil.class);
public static int download(String ip,int port,String userName,String password,FileFilter filter,String localFilePath) throws SocketException, IOException{
return download(ip, port, userName, password, null,filter, localFilePath);
}
public static int download(String ip,int port,String userName,String password,String ftpPath,FileFilter filter,String localFilePath) throws SocketException, IOException{
FTPClient ftp = new FTPClient();
int i=0;
try {
// 不為空連接 通過IP 和端口
ftp.connect(ip, port);
// 登陸
if (ftp.login(userName, password)) {
ftp.enterLocalPassiveMode();
// 獲取FTP登陸目錄下的所有文件
if(ftpPath!=null){
if(!ftp.changeWorkingDirectory(ftpPath)){
throw new RuntimeException("找不到該目錄:"+ftpPath);
}
}
FTPFile[] files = ftp.listFiles();
for (FTPFile file : files) {
String fileName = file.getName();
if (filter.accept(fileName)) {
BufferedOutputStream out = null;
try {
// IO流下載文件到本地
out = new BufferedOutputStream(
new FileOutputStream(new File(localFilePath
,fileName)));
// 開始下載
ftp.retrieveFile(file.getName(), out);
log.info("下載文件:" + file.getName() + "到本地路徑:"
+ localFilePath);
i++;
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
log.error("", e);
}
}
}
}
} else {
i = -1;
}
} finally {
if(ftp != null&&ftp.isConnected()){
try {
log.info("關閉ftp連接");
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return i;
}
public static int download(String ip,int port,String userName,String password,String ftpPath,final String fileName,String localFilePath)throws SocketException, IOException{
return download(ip, port, userName, password,ftpPath,new FileFilter(){
public boolean accept(String fileName1) {
return fileName.equalsIgnoreCase(fileName1);
}
}, localFilePath);
}
public static int download(String ip,int port,String userName,String password,final String fileName,String localFilePath)throws SocketException, IOException{
return download(ip, port, userName, password,null,fileName, localFilePath);
}
/**
* ftp上傳文件至服務器
* @throws SocketException
* @throws IOException
*/
public static void uploadFile(String ip, int port, String userName, String password, String localFile)
throws SocketException, IOException{
log.info("上傳本地文件: " + localFile);
File file = new File(localFile);
InputStream in = null;
FTPClient ftpClient = null;
if(file != null){
try {
ftpClient = new FTPClient();
in = new FileInputStream(file);
ftpClient.connect(ip,port);
if(ftpClient.login(userName, password)){
ftpClient.enterLocalPassiveMode();
boolean flag= ftpClient.appendFile(file.getName(), in);
log.info("上傳文件成功:" + flag);
}
}catch (SocketException e) {
log.error("ftp上傳文件失敗:", e);
throw e;
}catch (IOException e) {
log.error("ftp上傳文件失敗:", e);
throw e;
} finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ftpClient != null){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public static void upload(String ip, int port, String userName, String password, String path,String remotePath)
throws SocketException, IOException{
upload(ip, port, userName, password, new File(path), remotePath);
}
/**
* ftp上傳文件至服務器
* @throws SocketException
* @throws IOException
*/
public static void upload(String ip, int port, String userName, String password, File localFile,String remotePath)
throws SocketException, IOException{
log.info("上傳本地文件: " + localFile.getName());
InputStream in = null;
FTPClient ftpClient = null;
if(localFile != null){
try {
ftpClient = new FTPClient();
in = new FileInputStream(localFile);
ftpClient.connect(ip,port);
if(ftpClient.login(userName, password)){
ftpClient.enterLocalPassiveMode();
if(remotePath!=null){
if(!ftpClient.changeWorkingDirectory(remotePath)){
ftpClient.makeDirectory(remotePath);
ftpClient.changeWorkingDirectory(remotePath);
}
}
boolean flag= ftpClient.storeFile(localFile.getName(), in);
log.info("上傳文件成功:" + flag);
}
}catch (SocketException e) {
log.error("ftp上傳文件失敗:", e);
throw e;
}catch (IOException e) {
log.error("ftp上傳文件失敗:", e);
throw e;
} finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ftpClient != null){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
posted @
2011-01-21 12:01 David1228 閱讀(2696) |
評論 (0) |
編輯 收藏