The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          #

          不同的JVM及其選項會輸出不同的日志。

          GC 日志

          生成下面日志使用的選項: -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:d:/GClogs/tomcat6-gc.log

          4.231: [GC 4.231: [DefNew: 4928K->512K(4928K), 0.0044047 secs] 6835K->3468K(15872K), 0.0045291 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
           
          4.445: [Full GC (System) 4.445: [Tenured: 2956K->3043K(10944K), 0.1869806 secs] 4034K->3043K(15872K), [Perm : 3400K->3400K(12288K)], 0.1870847 secs] [Times: user=0.05 sys=0.00, real=0.19 secs] 
          

          最前面的數字 4.231  4.445 代表虛擬機啟動以來的秒數。

          [GC  [Full GC 是垃圾回收的停頓類型,而不是區分是新生代還是年老代,如果有 Full 說明發生了 Stop-The-World 。如果是調用 System.gc() 觸發的,那么將顯示的是 [Full GC (System) 

          接下來的 [DefNew, [Tenured, [Perm 表示 GC 發生的區域,區域的名稱與使用的 GC 收集器相關。 Serial 收集器中新生代名為 "Default New Generation",顯示的名字為 "[DefNew"。對于ParNew收集器,顯示的是 "[ParNew",表示 “Parallel New Generation”。 對于 Parallel Scavenge 收集器,新生代名為 "PSYoungGen"。年老代和永久代也相同,名稱都由收集器決定。

          方括號內部顯示的 “4928K->512K(4928K)” 表示 “GC 前該區域已使用容量 -> GC 后該區域已使用容量 (該區域內存總容量) ”。

          再往后的 “0.0044047 secs” 表示該區域GC所用時間,單位是秒。

          再往后的 “6835K->3468K(15872K)” 表示 “GC 前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆總容量)”。

          再往后的 “0.0045291 secs” 是Java堆GC所用的總時間。

          最后的 “[Times: user=0.00 sys=0.00, real=0.00 secs]” 分別代表 用戶態消耗的CPU時間、內核態消耗的CPU時間 和 操作從開始到結束所經過的墻鐘時間。墻鐘時間包括各種非運算的等待耗時,如IO等待、線程阻塞。CPU時間不包括等待時間,當系統有多核時,多線程操作會疊加這些CPU時間,所以user或sys時間會超過real時間。

          堆的分代

          JVM-heap-generations

          在上圖中:

          • young區域就是新生代,存放新創建對象;
          • tenured是年老代,存放在新生代經歷多次垃圾回收后仍存活的對象;
          • perm是永生代,存放類定義信息、元數據等信息。

          當GC發生在新生代時,稱為Minor GC,次收集;當GC發生在年老代時,稱為Major GC,主收集。 一般的,Minor GC的發生頻率要比Major GC高很多。

          posted @ 2015-06-18 11:28 Eric_jiang 閱讀(259) | 評論 (0)編輯 收藏

               摘要: 這個是之前處理過的一個線上問題,處理過程斷斷續續,經歷了兩周多的時間,中間各種嘗試,總結如下。這篇文章分三部分: 1、問題的場景和處理過程;2、GC的一些理論東西;3、看懂GC的日志 先說一下問題吧 問題場景:線上機器在半夜會推送一個700M左右的數據,這個時候有個數據置換的過程,也就是說有700M*2的數據在heap區域中,線上系統超時比較多,導致了很嚴重(嚴重程度就不說了)的問題。 問...  閱讀全文
          posted @ 2015-06-18 11:24 Eric_jiang 閱讀(315) | 評論 (0)編輯 收藏

          VM性能的快速測試方法


          核心提示: 經常有同行問怎么樣去做這些性能評測。其實這些性能評測都很簡單,任何一個具備Linux基礎知識的工程師都可以完成。我們通常使用UnixBench來評估虛擬機CPU性能,mbw來評估內存性能,iozone來評估文件IO性能,iperf來評估網絡性能,pgbench來評估數據庫性能。在這里我將我自己做性能測試的過程整理一下,供各位同行參考。

          中國IDC圈10月30日報道 前段時間陸續發布了一些對公有云服務性能評測的數據。經常有同行問怎么樣去做這些性能評測。其實這些性能評測都很簡單,任何一個具備Linux基礎知識的工程師都可以完成。我們通常使用UnixBench來評估虛擬機CPU性能,mbw來評估內存性能,iozone來評估文件IO性能,iperf來評估網絡性能,pgbench來評估數據庫性能。在這里我將我自己做性能測試的過程整理一下,供各位同行參考。

          (0)安裝必要的軟件

          假定VM的操作系統是Ubuntu,可以按照如下步驟安裝必要的軟件:

          20141030104942

          (1)CPU性能測試

          我們使用UnixBench來進行CPU性能測試。UnixBench是一套具有悠久歷史的性能測試工具,其測試結果反映的是一臺主機的綜合性能。從理論上來說UnixBench測試結果與被測試主機的CPU、內存、存儲、操作系統都有直接的關系。但是根據我們的觀察,對于現代的計算機系統來說,UnixBench測試結果受CPU 處理能力的影響更大一些。因此,在這里我們用UnixBench測試結果來代表虛擬機的vCPU 處理能力。每個UnixBench測試結果包括兩個數據,一個是單線程測試結果,另一個是多線程測試結果(虛擬機上有幾顆虛擬CPU,就有幾個并發的測試線程)。

          cd ~/UnixBench

          ./Run

          下面是一個可供參考的測試結果。在這個測試中使用了兩臺物理機,每臺物理機各配置一顆Intel Core i3 540 @ 3.07 GHz (雙核四線程),16 GB內存(DDR3 @ 1333 MHz),一塊Seagate ST2000DL003-9VT1硬盤(SATA,2TB,5900RPM),運行Ubuntu 10.04 AMD64 Server操作系統,使用的文件系統為ext4,使用的Hypervisor為KVM(qemu-kvm-0.12.3)。我們分別測試了宿主機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在本地磁盤上的虛擬機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在NFS上的虛擬機的CPU性能。虛擬機的配置為2 顆vCPU(占用兩個物理線程,也就是一個物理核心)和4 GB內存,運行Ubuntu 12.04 AMD64 Server操作系統。在這個測試中沒有對操作系統、文件系統、NFS、KVM等等進行任何性能調優。

          14982672_201410291058471naZq

           

          從如上測試結果可以看出,在沒有進行任何性能調優的情況下,在單線程CPU性能方面,宿主機 >> 本地磁盤上的虛擬機 >> NFS服務上的虛擬機;在多線程CPU性能方面,宿主機 >> 本地磁盤上的虛擬機 = NFS服務上的虛擬機。需要注意的是,在多線程測試結果方面,宿主機所占的優勢完全是由于宿主機比虛擬機多占用了兩個物理線程,也就是一個物理核心。可以認為,在如上所述測試中,物理機和虛擬機的CPU性能基本上是一致的,虛擬化基本上沒有導致CPU性能損失。

          (2)文件IO性能測試

          我們使用iozone來進行文件IO性能測試。iozone性能測試結果表示的是文件IO的吞吐量(KBps),但是通過吞吐量可以估算出IOPS.在如下命令中,我們評估的是以256K為數據塊大小對文件進行寫、重寫、讀、重讀、隨機讀、隨機寫性能測試,在測試過程當中使用/io.tmp作為臨時測試文件,該測試文件的大小是4 GB.需要注意的是,命令中所指定的測試文件是帶路徑的,因此我們可以測試同一虛擬機上不同文件系統的性能。例如我們通過NFS將某一網絡共享文件系統掛載到虛擬機的/mnt目錄,那么我們可以將該測試文件的路徑設定為/mnt/io.tmp.

          cd ~/iozone3_414/src/current

          ./iozone -Mcew -i0 -i1 -i2 -s4g -r256k -f /io.tmp

          下面是一個可供參考的測試結果。在這個測試中使用了兩臺物理機,每臺物理機各配置一顆Intel Core i3 540 @ 3.07 GHz (雙核四線程),16 GB內存(DDR3 @ 1333 MHz),一塊Seagate ST2000DL003-9VT1硬盤(SATA,2TB,5900RPM),運行Ubuntu 10.04 AMD64 Server操作系統,使用的文件系統為ext4,使用的Hypervisor為KVM(qemu-kvm-0.12.3)。我們分別測試了宿主機、NFS、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在本地磁盤上的虛擬機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在NFS上的虛擬機、以及從虛擬機內部掛載宿主機NFS服務(虛擬網卡啟用了virtio)的磁盤IO性能。虛擬機的配置為2 顆vCPU(占用兩個物理線程,也就是一個物理核心)和4 GB內存,運行Ubuntu 12.04 AMD64 Server操作系統。在這個測試中沒有對操作系統、文件系統、NFS、KVM等等進行任何性能調優。

          14982672_201410291058472o0uv

          從如上測試結果可以看出,在如上所述特定測試場景中,在文件IO性能方面,宿主機 > NFS > 虛擬機中的NFS > 本地磁盤上的虛擬機 >NFS服務上的虛擬機。值得注意的是,即使是從虛擬機中掛載NFS服務,其文件IO性能也遠遠超過本地磁盤上的虛擬機。
                  

          [特別說明]需要注意的是,當我們說文件(或者磁盤)IO性能的時候,我們指的通常是應用程序(例如iozone)進行文件讀寫操作時所看到的IO性能。這個性能通常是與系統相關的,包括了多級緩存(磁盤自身的緩存機制、操作系統的緩存機制)的影響,而不僅僅是磁盤本身。利用iozone進行文件IO性能測試時,測試結果與主機的內存大小、測試數據塊的大小、測試文件的大小都有很大的關系。如果要全面地描述一個特定系統(CPU、內存、硬盤)的文件IO性能,往往需要對測試數據塊的大小和測試文件的大小進行調整,進行一系列類似的測試并對測試結果進行全面分析。本文所提供的僅僅是一個快速測試方法,所提供的測試參數并沒有針對任何特定系統進行優化,僅僅是為了說明iozone這個工具的使用方法。如上所述之測試數據,僅僅在如上所述之測試場景下是有效的,并不足以定性地說明任何虛擬化場景下宿主機和虛擬機的文件IO性能差異。建議讀者在掌握了iozone這個工具的使用方法的基礎上,對被測試對象進行更加全面的測試。(感謝saphires網友的修改建議。)

          (3)內存性能測試

          我們使用mbw來測試虛擬機的內存性能。mbw通常用來評估用戶層應用程序進行內存拷貝操作所能夠達到的帶寬(MBps)。

          mbw 128

          下面是一個可供參考的測試結果。在這個測試中使用了兩臺物理機,每臺物理機各配置一顆Intel Core i3 540 @ 3.07 GHz (雙核四線程),16 GB內存(DDR3 @ 1333 MHz),一塊Seagate ST2000DL003-9VT1硬盤(SATA,2TB,5900RPM),運行Ubuntu 10.04 AMD64 Server操作系統,使用的文件系統為ext4,使用的Hypervisor為KVM(qemu-kvm-0.12.3),虛擬機運行Ubuntu 12.04 AMD64 Server操作系統。我們分別測試了宿主機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在本地磁盤上的虛擬機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在NFS上的虛擬機的內存性能。虛擬機的配置為2 顆vCPU(占用兩個物理線程,也就是一個物理核心)和4 GB內存。在這個測試中沒有對操作系統、文件系統、NFS、KVM等等進行任何性能調優。

          14982672_201410291058473O2O9

          從如上測試結果可以看出,在沒有進行任何性能調優的情況下,宿主機、本地磁盤上的虛擬機、NFS服務上的虛擬機在內存性能方面基本上是一致的,虛擬化基本上沒有導致內存性能損失。

          (4)網絡帶寬測試

          我們使用iperf來測試虛擬機之間的網絡帶寬(Mbps)。測試方法是在一臺虛擬機上運行iperf服務端,另外一臺虛擬機上運行iperf客戶端。假設運行服務端的虛擬機的IP地址是192.168.1.1,運行客戶端的虛擬機的IP地址是192.168.1.2.

          在服務端執行如下命令:

          iperf -s

          在客戶端執行如下命令:

          iperf -c 192.168.1.1

          測試完成后,在客戶端會顯示兩臺虛擬機之間的網絡帶寬。

          下面是一個可供參考的測試結果。在這個測試中使用了兩臺物理機,每臺物理機各配置一顆Intel Core i3 540 @ 3.07 GHz (雙核四線程),16 GB內存(DDR3 @ 1333 MHz),一塊Seagate ST2000DL003-9VT1硬盤(SATA,2TB,5900RPM),運行Ubuntu 10.04 AMD64 Server操作系統,使用的文件系統為ext4,使用的Hypervisor為KVM(qemu-kvm-0.12.3)。我們分別測試了宿主機之間、宿主機與虛擬機之間、虛擬機與虛擬機之間的內網帶寬。虛擬機的配置為2 顆vCPU(占用兩個物理線程,也就是一個物理核心)和4 GB內存。虛擬機的配置為2 顆vCPU(占用兩個物理線程,也就是一個物理核心)和4 GB內存,運行Ubuntu 12.04 AMD64 Server操作系統。在這個測試中沒有對操作系統、文件系統、NFS、KVM等等進行任何性能調優,但是虛擬機的網卡啟用了virtio.

          從如上測試結果可以看出,宿主機之間的內網帶寬接近內網交換

          14982672_201410291058474jZZA

          機的極限。在啟用了virtio的情況下,宿主機與虛擬機之間內網帶寬有小幅度的性能損失,基本上不會影響數據傳輸能力;虛擬機與虛擬機之間的內網帶寬有接近15%的損失,對數據傳輸能力影響也不是很大。

          (5)數據庫性能測試

          postgresql是一個著名的開源數據庫系統。在MySQL被Sun 公司收購并進一步被Oracle公司收購之后,越來越多的公司正在從MySQL遷移到postgresql.pgbench是一個針對postgresql的性能測試工具,其測試結果接近于TPC-B.pgbench的優點之一在于它能夠輕易地進行多線程測試,從而充分利用多核處理器的處理能力。

          在虛擬機上以postgres用戶登錄:

          su -l postgres

          將/usr/lib/postgresql/9.1/bin加入到路徑PATH當中。

          創建測試數據庫:

          createdb pgbench

          初始化測試數據庫:

          pgbench -i -s 16 pgbench

          執行單線程測試:

          pgbench -t 2000 -c 16 -U postgres pgbench

          執行多線程測試,在下面的命令中將N替換為虛擬機的vCPU數量:

          pgbench -t 2000 -c 16 -j N -U postgres pgbench

          下面是一個可供參考的測試結果。在這個測試中使用了兩臺物理機,每臺物理機各配置一顆Intel Core i3 540 @ 3.07 GHz (雙核四線程),16 GB內存(DDR3 @ 1333 MHz),一塊Seagate ST2000DL003-9VT1硬盤(SATA,2TB,5900RPM),運行Ubuntu 10.04 AMD64 Server操作系統,使用的文件系統為ext4,使用的Hypervisor為KVM(qemu-kvm-0.12.3),虛擬機運行Ubuntu 12.04 AMD64 Server操作系統。我們分別測試了宿主機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在本地磁盤上的虛擬機、磁盤映像以文件格式(RAW格式,沒有啟用virtio)存儲在NFS上的虛擬機的數據庫性能。虛擬機的配置為2 顆vCPU(占用兩個物理線程,也就是一個物理核心)和4 GB內存,運行Ubuntu 12.04 AMD64 Server操作系統。在這個測試中沒有對操作系統、文件系統、NFS、KVM等等進行任何性能調優。

          14982672_201410291058475a5wk

          從如上測試結果可以看出,在沒有進行任何性能調優的情況下,在數據庫性能方面,宿主機 >> 本地磁盤上的虛擬機 >> NFS服務上的虛擬機。


           

          posted @ 2015-06-16 10:50 Eric_jiang 閱讀(180) | 評論 (0)編輯 收藏

          本文是參考logstash官方文檔實踐的筆記,搭建環境和所需組件如下:

          • Redhat 5.7 64bit / CentOS 5.x
          • JDK 1.6.0_45
          • logstash 1.3.2 (內帶kibana)
          • elasticsearch 0.90.10
          • redis 2.8.4

          搭建的集中式日志分析平臺流程如下: 

          安裝logstash+kibana+elasticsearch+redis搭建日志分析平臺 - 傲風 - 0與1構筑世界,程序員創造時代

           

          elasticsearch

          1、下載elasticsearch。

          wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.10.tar.gz 

          2、解壓后,進入bin目錄。執行如下命令,讓elasticsearch以前臺方式啟動:

          ./elasticsearch -f 
          [2014-01-16 16:21:31,825][INFO ][node                     ] [Saint Elmo] version[0.90.10], pid[32269], build[0a5781f/2014-01-10T10:18:37Z] [2014-01-16 16:21:31,826][INFO ][node                     ] [Saint Elmo] initializing ... [2014-01-16 16:21:31,836][INFO ][plugins                  ] [Saint Elmo] loaded [], sites [] [2014-01-16 16:21:35,425][INFO ][node                     ] [Saint Elmo] initialized [2014-01-16 16:21:35,425][INFO ][node                     ] [Saint Elmo] starting ... [2014-01-16 16:21:35,578][INFO ][transport                ] [Saint Elmo] bound_address {inet[/0.0.0.0:9300]}, publish_address {inet[/10.0.2.15:9300]} 

          Redis

          1、其安裝方式可以參考我的另一篇文章Redis編譯安裝

          2、進入其bin目錄,執行如下命令,使之在控制臺輸出debug信息:

          ./redis-server --loglevel verbose 
          [32470] 16 Jan 16:45:57.330 * The server is now ready to accept connections on port 6379 [32470] 16 Jan 16:45:57.330 - 0 clients connected (0 slaves), 283536 bytes in use 

          logstash日志生成器(shipper)

          1、新建一個配置文件:shipper.conf,其內容如下:

          input {     stdin {         type => "example"     } }  output {     stdout {         codec => rubydebug     }     redis {         host => "127.0.0.1"         port => 6379         data_type => "list"         key => "logstash"     } } 

          2、啟動shipper。執行如下命令:

          java -jar logstash-1.3.2-flatjar.jar agent -f shipper.conf  

          終端窗口將出現如下提示信息:

          Using milestone 2 output plugin 'redis'. This plugin should be stable, but if you see strange behavior, please let us know! For more information on plugin milestones, see http://logstash.net/docs/1.3.2/plugin-milestones {:level=>:warn} 

          然后在終端窗口直接按回車,將出現如下信息:

          {        "message" => "",       "@version" => "1",     "@timestamp" => "2014-01-16T08:15:19.400Z",           "type" => "example",           "host" => "redhat" } 

          這個json信息將發送給redis, 同時redis的終端窗口將出現類似下面的提示信息:

          [32470] 16 Jan 17:09:23.604 - Accepted 127.0.0.1:44640 [32470] 16 Jan 17:09:27.127 - DB 0: 1 keys (0 volatile) in 4 slots HT. [32470] 16 Jan 17:09:27.127 - 1 clients connected (0 slaves), 304752 bytes in use 

          logstash日志索引器(indexer)

          1、新建一個配置文件:indexer.conf,其內容如下:

          input {   redis {     host => "127.0.0.1"     # these settings should match the output of the agent     data_type => "list"     key => "logstash"      # We use the 'json' codec here because we expect to read     # json events from redis.     codec => json   } }  output {   stdout { debug => true debug_format => "json"}    elasticsearch {     host => "127.0.0.1"   } } 

          2、啟動日志索引器。執行如下命令:

          java -jar logstash-1.3.2-flatjar.jar agent -f indexer.conf  

          終端窗口將出現如下提示信息:

          Using milestone 2 input plugin 'redis'. This plugin should be stable, but if you see strange behavior, please let us know! For more information on plugin milestones, see http://logstash.net/docs/1.3.2/plugin-milestones {:level=>:warn} You are using a deprecated config setting "debug_format" set in stdout. Deprecated settings will continue to work, but are scheduled for removal from logstash in the future.  If you have any questions about this, please visit the #logstash channel on freenode irc. {:name=>"debug_format", :plugin=>, :level=>:warn} 

          索引器從Redis接收到信息,在終端窗口會顯示類似如下的信息:

          {"message":"","@version":"1","@timestamp":"2014-01-16T17:10:03.831+08:00","type":"example","host":"redhat"}{"message":"","@version":"1","@timestamp":"2014-01-16T17:13:20.545+08:00","type":"example","host":"redhat"}{ 

          logstash WEB界面(kibana)

          1、啟動kibana。執行如下命令:

          java -jar logstash-1.3.2-flatjar.jar web 

          2、打開瀏覽器(須支持HTML5),輸入地址:http://127.0.0.1:9292/index.html#/dashboard/file/logstash.json。界面效果如下: 

          安裝logstash+kibana+elasticsearch+redis搭建日志分析平臺 - 傲風 - 0與1構筑世界,程序員創造時代
           

          參考資料

          posted @ 2015-06-12 11:30 Eric_jiang 閱讀(487) | 評論 (0)編輯 收藏

          Fluentd是一個開源收集事件和日志系統,它目前提供150+擴展插件讓你存儲大數據用于日志搜索,數據分析和存儲。

          官方地址http://fluentd.org/  插件地址http://fluentd.org/plugin/

          Kibana 是一個為 ElasticSearch 提供日志分析的 Web ui工具,可使用它對日志進行高效的搜索、可視化、分析等各種操作。官方地址http://www.elasticsearch.org/overview/kibana/

          elasticsearch 是開源的(Apache2協議),分布式的,RESTful的,構建在Apache Lucene之上的的搜索引擎.

          官方地址http://www.elasticsearch.org/overview/    中文地址 http://es-cn.medcl.net/


          具體的工作流程就是利用fluentd 監控并過濾hadoop集群的系統日志,將過濾后的日志內容發給全文搜索服務ElasticSearch, 然后用ElasticSearch結合Kibana 進行自定義搜索web頁面展示.

          下面開始說部署方法和過程。以下安裝步驟在centos 5 64位測試通過

          一、  elasticsearch安裝部署

          elasticsearch 官方提供了幾種安裝包,適用于windows的zip壓縮包,適用于unix/linux的tar.gz壓縮包,適用于centos系統的rpm包和ubuntu的deb包。大家可以自己選擇安裝使用。

          因為elasticsearch 需要java環境運行,首先需要安裝jdk,安裝步驟就省略了。

          使用.tar.gz壓縮包安裝部署的話,先下載壓縮包

          # wget  https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.5.tar.gz

          # tar zxvf elasticsearch-0.90.5.tar.gz

          ////////////如果是單機部署

          # cd elasticsearch-0.90.5

          # elasticsearch-0.90.5/bin/elasticsearch -f

          就可以啟動搜索服務了,查看端口9200是否打開,如果打開說明啟動正常。

          ////////////////如果是部署集群的話,需要進行配置

          例如在192.168.0.1   192.168.0.2 兩臺服務器部署,兩臺服務器都安裝好jdk,下載elasticsearch 解壓縮,然后編輯配置文件

          //////////////////////192.168.0.1   服務器編輯文件

          vi elasticsearch-0.90.5/config/elasticsearch.yml

          刪除cluster.name 前面注釋,修改集群名稱 

          cluster.name: es_cluster

          刪除node.name前注釋 ,修改節點名稱,不修改的話,系統啟動后會生成隨即node名稱。

          node.name: "elastic_inst1"

          node.master: true    設置該節點為主節點


          /////////////////////////192.168.0.2  編輯文件

          vi elasticsearch-0.90.5/config/elasticsearch.yml

          刪除cluster.name 前面注釋,修改集群名稱 

          cluster.name: es_cluster

          刪除node.name前注釋 ,修改節點名稱,不修改的話,系統啟動后會生成隨即node名稱。

          node.name: "elastic_inst2"

          node.master: false    設置該節點為主節點


          分別啟動兩臺服務器的服務后,在192.168.0.2的日志中會看到

           [elastic_inst2] detected_master [elastic_inst1]     日志信息。說明集群連接成功。


          二、安裝部署fluentd

          在需要監控分析的hadoop集群節點中安裝fluentd,安裝步驟很簡單


          curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh

          安裝完成后,編輯配置文件

          # vim /etc/td-agent/td-agent.conf

          1. <source>  
          2.   type tail  #### tail方式采集日志  
          3.   path /var/log/hadoop/mapred/hadoop-mapred-tasktracker-node-128-70.log   ### hadoop日志路徑  
          4.   pos_file /var/log/td-agent/task-access.log.pos  
          5.   tag task.mapred  
          6.   format /^(?<message>.+(WARN|ERROR).+)$/   #### 收集error 或者warn 日志。  
          7. </source>  
          8.   
          9. <match task.**>  
          10.   host 192.168.0.1  #####  <span style="font-family:Arial,Helvetica,sans-serif">elasticsearch 服務器地址</span>  
          11.   type elasticsearch  
          12.   logstash_format true  
          13.   flush_interval 5s  
          14.   include_tag_key true  
          15.   tag_key mapred  
          16. </match>  

          啟動fluentd 服務

          # service td-agent start


          三、安裝部署kibana 3

          kibana 3 是使用html 和javascript 開發的web ui前端工具。

          下載 wget http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip

          解壓縮 unzip kibana-latest.zip

          安裝apache    yum -y install httpd

          cp -r  kibana-latest /var/www/html

          因為我將kibana3 安裝在和elasticsearch同一臺服務器中,所以不用修改配置文件

          啟動apache  service httpd start

          打開瀏覽器 http://ip/kibana 就可以看到kibana 界面

          初次使用kibana 需要自己定義模塊




          posted @ 2015-06-12 11:05 Eric_jiang 閱讀(810) | 評論 (0)編輯 收藏

          前言
              持續集成這個概念已經成為軟件開發的主流,可以更頻繁的進行測試,盡早發現問題并提示。自動化部署就更不用說了,可以加快部署速度,并可以有效減少人為操作的失誤。之前一直沒有把這個做起來,最近的新項目正好有機會,費了一番功夫總算搞好了,特此記錄。

          1. 開發環境
              我這邊建立的標準開發環境如下:
              1. Maven做項目管理;
              2. Git做代碼管理;
              3. SpringMVC+Spring+Mybatis搭建的程序框架;
              4. Mysql作為數據存儲,Druid做連接池;
              5. unitils作為測試框架;
              6. Hibernate Validator作為數據驗證;

              7. log4j作為日志輸出。
              注:其實這套東西非常像Grails,但不敢用太激進的技術和框架,擔心招人的問題-_-!

          2. Jenkins的部署
              Jenkins原名是Hudson,這個淵源這里就不追溯了,網上多得是,但是千萬別下錯了,官網地址是http://jenkins-ci.org/。建議直接下載最新版本。

              這個軟件的安裝是我見過最簡單的了,直接取war包放到tomcat下,啟動tomcat即可。相應的工程配置會在~/.jenkins目錄中。(當然你根據官網給的那種安裝方法也行,只是在debian的那個弄法還要去下載openjdk等等,多下了很多東西,相關配置也按linux目錄標準分開的,還要去找。)

              另外提醒一下,建議把Jenkins安裝在Linux上,這樣就不會出現ssh等命令找不到的問題,否則還要想辦法去處理。

          3. Jenkins的插件
              安裝好后直接訪問“http://yourhost:8080/jenkins”即可進入主界面,點擊“系統管理”->“管理插件”,首次進入都是空白的,要等1分鐘左右才能看到內容,在后臺估計是在做更新或者下載,然后重新再進此界面就能看到內容了。

          3.1 Git插件
              在“可選插件”中找到“GIT plugin”安裝,最下面有個安裝完重啟的勾選項,選中即可。這里最搞笑的是檢測網絡是否連通的辦法是去嘗試打開google,豈不知天朝是打不開的,還好不影響下載。。。

          3.2 Email插件
              這個事情非常蛋疼,之前測試怎么都發布出來郵件,最后升級了一下默認插件就行了,狂汗。在“可更新”中找到“Mailer Plugin”選中并更新即可。另外如果想有更豐富的郵件內容,就去“可選插件”中安裝“Email Extension Plugin”,具體郵件內容配置網上大把可以搜。

          3.3 其他插件
              默認就裝了很多常用插件,比如Maven、Junit等等,如果使用感覺有問題可以嘗試升級一下版本,但是沒有升級說明,也不知道升級了什么東西。


          4. 系統設置
              主界面點擊“系統管理”->“系統設置”即可進入。重點配置以下內容:
              1. Java、Git、Maven的目錄位置,確保可以正確找到命令;

              2. Jenkins URL,自動生成的,檢查一下即可;
              3. 郵件的設置。這里注意一下,上面有一個“系統管理員郵件地址”需要填寫,另外“Extended E-mail Notification”中填寫配置,原來的“郵件配置”就不用再理會了。

          5. 項目設置
              在主界面直接“新建”,就會有一個新的項目。重點配置以下內容:

              1. 源碼管理:選擇Git,填寫“Repository URL”,并加上相應的“Credentials”,其中認證信息用私鑰的話干脆直接把私鑰內容填上去就行了,省的不知道目錄查找規則還不知道出的啥問題。

              2. 構建觸發器:這個地方要把“Build periodically”和“Poll SCM”都選上,時間格式都填寫成一樣的即可,比如“H/15  * * * *”,下面會有個具體執行時間的提示,Build動作會自動比Poll延遲3分40秒,這個設定還是很合理的。

              3. 構建:增加兩個構建步驟,分別是“Execute shell”和“Invoke top-level Maven target”,注意先后順序,可以拖拽擺放的。腳本執行根據自己需要,比如我需要去修改數據庫連接配置,官方建議是自己在工程里面寫好腳本,這里直接調用,而不是在這寫一個完整的腳本。Maven構建就加上“clean test”即可,就是運行“mvn clean test”的命令。

              4. Publish Junit test result report:在測試報告(XML)上加上“**/target/surefire-reports/*.xml”即可,這樣就會每次測試完自動找到測試報告,在Jenkins上即可在每個構建結構里面查看到。

              5. 郵件通知:在構建后增加“Editable Email Notification”,填寫郵件的接受者、內容格式可以直接用全局變量,重點是配置一下發送觸發條件。

          6. 安全性配置
              經過以上配置進行一次構建就會發現,Jenkins可以看到太多內容了,包括pull到的源碼,所以非常有必要增加權限控制。進入“系統管理”->“Configure Global Security”中進行如下步驟:
              1. 啟用安全;

              2. Jenkins專有用戶數據庫,先允許用戶注冊;
              3. 授權策略選擇“安全矩陣”,新加一個“admin”的用戶,把所有權限都開給admin用戶;
              4. 在主界面的用戶中找到admin,進行配置,設置登陸密碼;
              5. 先重新登陸測試一下是否admin正常,沒有問題就關閉允許用戶注冊,把匿名用戶的所有權限都去掉。

          7. 自動化部署
              這里我沒有讓Jenkins每次測試都去部署,一方面是考慮到單元測試基本已經滿足需要了,另一方面因為測試太頻繁了,一直部署也搞得Stage測試環境要經常重啟,反而影響正常的人工測試。所以自己寫了個腳本,在必要的時候去運行一下去自動完成整個部署工作。
          #!/bin/sh 
            
          # update code 
          git pull 
            
          # package 
          mvn clean 
          mvn package -Dmaven.test.skip=true
            
          # deploy 
          WAR=`ls target | grep war` 
          TOMCAT=/home/test/apache-tomcat-6.0.41 
          mv target/$WAR $TOMCAT 
          cd $TOMCAT 
          # invoke another deploy script 
          sh deploy-war.sh $WAR webapps

           

          8. 一個非常蛋疼的問題
              這個和以上問題都無關,只是極其不解的是這個錯誤在Windows下不出現,在Linux下打成War也不會出現,只有在Linux下直接執行Maven test就會出錯。其實問題的根源就是配置書寫不夠規范,但是錯誤出現的不一致性實在讓人蛋疼。報錯如下:
          1 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx

              這個就是Mybatis找不到綁定的類,但是xml是正確打包的,怎么看都是沒大問題,并且windows也是對的,最后發現是我在寫模糊路徑的時候,classpath后面必須要加個*才是標準寫法,正確寫法如下:

              <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
                  <property name="basePackage" value="com.gzxitao.demo.*.dao"/> 
              </bean> 
            
              <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
                  <property name="dataSource" ref="dataSource"/> 
                  <property name="configLocation" value="classpath:configuration.xml"/> 
                  <!-- 這里是要掃描多個目錄下的文件,必須聲明成“classpath*”,否則在某些情況下會報錯 -->
                  <property name="mapperLocations" value="classpath*:com/gzxitao/demo/*/dao/*.xml" /> 
              </bean>

          Maven權威指南_中文完整版清晰PDF  http://www.linuxidc.com/Linux/2014-06/103690.htm

          Maven 3.1.0 發布,項目構建工具 http://www.linuxidc.com/Linux/2013-07/87403.htm

          Linux 安裝 Maven http://www.linuxidc.com/Linux/2013-05/84489.htm

          Maven3.0 配置和簡單使用 http://www.linuxidc.com/Linux/2013-04/82939.htm

          Ubuntu下搭建sun-jdk和Maven2 http://www.linuxidc.com/Linux/2012-12/76531.htm

          Maven使用入門 http://www.linuxidc.com/Linux/2012-11/74354.htm

          Jenkins的分布式構建及部署——節點  http://www.linuxidc.com/Linux/2015-05/116903.htm

          Jenkins 的詳細介紹請點這里
          Jenkins 的下載地址請點這里

          本文永久更新鏈接地址http://www.linuxidc.com/Linux/2015-06/118606.htm

          posted @ 2015-06-12 10:59 Eric_jiang 閱讀(452) | 評論 (0)編輯 收藏

          《目錄》

          一、安裝Jenkins

          二、配置Jenkins

          三、自動編譯

          四、自動測試

          五、自動部署

          一、安裝Jenkins

          地址http://mirrors.jenkins-ci.org/下載適合的Jenkins版本。

          Windows最新穩定版的Jenkins地址為:http://mirrors.jenkins-ci.org/windows-stable/jenkins-1.409.1.zip

          Jenkins 1.409.1版解壓,把得到的war包直接扔到tomcat下,啟動tomcatJenkins就安裝完畢,是不是很簡單啊。

          二、配置Jenkins

          1、打開http://10.3.15.78:8080/jenkins/,第一次進入里面沒有數據,我們需要創建job,我們這有2個項目,需要創建2jobhttp://10.3.34.163:9890/jenkins/

          2、點擊左上角的new job,在new job頁面需要選擇job的類型,Jenkins支持幾種類型,我們選擇“構建一個maven2/3項目”

          3、點擊OK按鈕后,進會進入詳細配置界面,詳細配置界面的配置項很多,不過不用怕,大部分使用默認配置就可以了,下面就說說我們需要修改的幾個地方:

          3.1Source Code Management

          因為我們使用SVN管理源碼,所以這里選擇Subversion,并在Repository URL中輸入我們的SVN地址:

          http://10.3.34.163:9880/XXXX/trunk/

          輸入SVN庫的URL地址后,Jenkins會自動驗證地址,并給予提示。

          點擊紅色字體部分的enter credential鏈接,進入頁面

          設置好訪問SVN庫的用戶名和密碼后,點擊OK按鈕

          設置成功。點擊Close按鈕,返回之前的Source Code Management頁面。此時不再有紅色警告信息了。

          3.2)配置自動構建的計劃,假設我們想讓項目中每天12點和晚上8點自動構建一次,只需要在Build Triggers中選擇Build periodically,并在Schedule中輸入 0 12,20 * * *

          我配置的是每晚8點自動構建

          注:Schedule的配置規則是有5個空格隔開的字符組成,從左到右分別代表:分年。*代表所有,0 12,20 * * * 表示“在任何年任何月任何天的12200分”進行構建。

          3.3)配置到這里,可能有人發現在Build配置節點,有紅色錯誤信息,提示

          Jenkins needs to know where your Maven2 is installed.
          Please do so from the system configuration.

          是因為Jenkins找不到maven的原因,點擊"system configuration",是system configurationmaven配置中添加maven目錄就OK。

          我設置了JRE 6MAVEN 3的安裝目錄。

          點擊左下角的SAVE按鈕,保存設置。

          3.4)保存好所有配置后,我們第1job就算是完成了。

          3.5)創建第2job,配置和上面的配置相同。只需把svn地址改成:http://localhost/svn/Web

          三、自動編譯

          在經過上面的配置后,回到Jenkins首頁,在首頁可以看到剛才添加的2job

          點擊某1job后后面的"Schedule a build"圖片手動構建,點擊完后,會在左邊的Build Queue或者Build Executor Status顯示正在構建的任務,在自動構建完后,刷新頁面,就可以看到構建結果了,如何某個項目構建失敗,點擊項目后面的構建數字(1開始遞增)進入項目的"Console Output "可以查看項目構建失敗的原因。當然我們也可以配置把構建失敗的結果發到郵箱。

          到目前為止,1個簡單的自動構建環境就搭建好了,很簡單吧。

          posted @ 2015-06-12 10:49 Eric_jiang 閱讀(276) | 評論 (0)編輯 收藏

          簡介

          awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。

          awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

          awk其名稱得自于它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。

           

          使用方法

          awk '{pattern + action}' {filenames}

          盡管操作可能會很復雜,但語法總是這樣,其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用于根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜杠括起來。

          awk語言的最基本功能是在文件或者字符串中基于指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。

          通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執行相應的命令,來處理文本。

           

          調用awk

          有三種方式調用awk

          復制代碼
          1.命令行方式 awk [-F  field-separator]  'commands'  input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。 在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。  2.shell腳本方式 將所有的awk命令插入一個文件,并使awk程序可執行,然后awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。 相當于shell腳本首行的:#!/bin/sh 可以換成:#!/bin/awk  3.將所有的awk命令插入一個單獨文件,然后調用: awk -f awk-script-file input-file(s) 其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
          復制代碼

           本章重點介紹命令行方式。

           

          入門實例

          假設last -n 5的輸出如下

          [root@www ~]# last -n 5 <==僅取出前五行 root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41) root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48) dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00) root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

          如果只是顯示最近登錄的5個帳號

          #last -n 5 | awk  '{print $1}'
          root
          root
          root
          dmtsai
          root

          awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。默認域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。

           

          如果只是顯示/etc/passwd的賬戶

          #cat /etc/passwd |awk  -F ':'  '{print $1}'   root daemon bin sys

          這種是awk+action的示例,每行都會執行action{print $1}。

          -F指定域分隔符為':'。

           

          如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

          #cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}' root    /bin/bash daemon  /bin/sh bin     /bin/sh sys     /bin/sh

           

          如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

          復制代碼
          cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}' name,shell root,/bin/bash daemon,/bin/sh bin,/bin/sh sys,/bin/sh .... blue,/bin/nosh
          復制代碼

          awk工作流程是這樣的:先執行BEGING,然后讀取文件,讀入有/n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨后開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執行END操作。

           

          搜索/etc/passwd有root關鍵字的所有行

          #awk -F: '/root/' /etc/passwd root:x:0:0:root:/root:/bin/bash

          這種是pattern的使用示例,匹配了pattern(這里是root)的行才會執行action(沒有指定action,默認輸出每行的內容)。

          搜索支持正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd

           

          搜索/etc/passwd有root關鍵字的所有行,并顯示對應的shell

          # awk -F: '/root/{print $7}' /etc/passwd              /bin/bash

           這里指定了action{print $7}

           

          awk內置變量

          awk有許多內置變量用來設置環境信息,這些變量可以被改變,下面給出了最常用的一些變量。

          復制代碼
          ARGC               命令行參數個數 ARGV               命令行參數排列 ENVIRON            支持隊列中系統環境變量的使用 FILENAME           awk瀏覽的文件名 FNR                瀏覽文件的記錄數 FS                 設置輸入域分隔符,等價于命令行 -F選項 NF                 瀏覽記錄的域的個數 NR                 已讀的記錄數 OFS                輸出域分隔符 ORS                輸出記錄分隔符 RS                 控制記錄分隔符
          復制代碼

           此外,$0變量是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。

           

          統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:

          #awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh

           

          使用printf替代print,可以讓代碼更加簡潔,易讀

           awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

           

          print和printf

          awk中同時提供了print和printf兩種打印輸出的函數。

          其中print函數的參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。

          printf函數,其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。

           

           awk編程

           變量和賦值

          除了awk的內置變量,awk還可以自定義變量。

          下面統計/etc/passwd的賬戶人數

          awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd root:x:0:0:root:/root:/bin/bash ...... user count is  40

          count是自定義變量。之前的action{}里都是只有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。

           

          這里沒有初始化count,雖然默認是0,但是妥當的做法還是初始化為0:

          awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd [start]user count is  0 root:x:0:0:root:/root:/bin/bash ... [end]user count is  40

           

          統計某個文件夾下的文件占用的字節數

          ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
          [end]size is  8657198

           

          如果以M為單位顯示:

          ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
          [end]size is  8.25889 M

          注意,統計不包括文件夾的子目錄。

           

          條件語句

           awk中的條件語句是從C語言中借鑒來的,見如下聲明方式:

          復制代碼
          if (expression) {     statement;     statement;     ... ... }  if (expression) {     statement; } else {     statement2; }  if (expression) {     statement1; } else if (expression1) {     statement2; } else {     statement3; }
          復制代碼

           

          統計某個文件夾下的文件占用的字節數,過濾4096大小的文件(一般都是文件夾):

          ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 
          [end]size is  8.22339 M

           

          循環語句

          awk中的循環語句同樣借鑒于C語言,支持while、do/while、for、break、continue,這些關鍵字的語義和C語言中的語義完全相同。

           

          數組

            因為awk中數組的下標可以是數字和字母,數組的下標通常被稱為關鍵字(key)。值和關鍵字都存儲在內部的一張針對key/value應用hash的表格里。由于hash不是順序存儲,因此在顯示數組內容時會發現,它們并不是按照你預料的順序顯示出來的。數組和變量一樣,都是在使用時自動創建的,awk也同樣會自動判斷其存儲的是數字還是字符串。一般而言,awk中的數組用來從記錄中收集信息,可以用于計算總和、統計單詞以及跟蹤模板被匹配的次數等等。

           

          顯示/etc/passwd的賬戶

          復制代碼
          awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd 0 root 1 daemon 2 bin 3 sys 4 sync 5 games ......
          復制代碼

          這里使用for循環遍歷數組

           

          awk編程的內容極多,這里只羅列簡單常用的用法,更多請參考 http://www.gnu.org/software/gawk/manual/gawk.html

          posted @ 2015-06-11 22:29 Eric_jiang 閱讀(189) | 評論 (0)編輯 收藏

          linux tee 命令詳解
          功能說明:讀取標準輸入的數據,并將其內容輸出成文件。
          語法:tee [-ai][--help][--version][文件...]
          補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。
          參數:
           -a或--append  附加到既有文件的后面,而非覆蓋它.
           -i-i或--ignore-interrupts  忽略中斷信號。
           --help  在線幫助。
           --version  顯示版本信息。

           

          用途說明

          在執行Linux命令時,我們可以把輸出重定向到文件中,比如 ls >a.txt,這時我們就不能看到輸出了,如果我們既想把輸出保存到文件中,又想在屏幕上看到輸出內容,就可以使用tee命令了。tee命令讀取標準輸入,把這些內容同時輸出到標準輸出和(多個)文件中(read from standard input and write to standard output and files. Copy standard input to each FILE, and also to standard output. If a FILE is -, copy again to standard output.)。在info tee中說道:tee命令可以重定向標準輸出到多個文件(`tee': Redirect output to multiple files. The `tee' command copies standard input to standard output and also to any files given as arguments.  This is useful when you want not only to send some data down a pipe, but also to save a copy.)。要注意的是:在使用管道線時,前一個命令的標準錯誤輸出不會被tee讀取。

           

          常用參數

          格式:tee

          只輸出到標準輸出,因為沒有指定文件嘛。

           

          格式:tee file

          輸出到標準輸出的同時,保存到文件file中。如果文件不存在,則創建;如果已經存在,則覆蓋之。(If a file being written to does not already exist, it is created. If a file being written to already exists, the data it previously
          contained is overwritten unless the `-a' option is used.)

           

          格式:tee -a file

          輸出到標準輸出的同時,追加到文件file中。如果文件不存在,則創建;如果已經存在,就在末尾追加內容,而不是覆蓋。

           

          格式:tee -

          輸出到標準輸出兩次。(A FILE of `-' causes `tee' to send another copy of input to standard output, but this is typically not that useful as the copies are interleaved.)

           

          格式:tee file1 file2 -

          輸出到標準輸出兩次,同時保存到file1和file2中。


          posted @ 2015-06-11 11:43 Eric_jiang 閱讀(171) | 評論 (0)編輯 收藏

          一 初級

          1)Notepad++ (編輯和查看Perl)

          2)Komobo Edit (編輯和執行Perl) 

           

          二 高級

          A  Perl Express

          主頁:http://www.perl-express.com/

          使用: 很簡單


          B Eclipse+EPIC+PadWalker

          a) 下載解壓Eclipse

          b)下載EPIC插件之設置 (help->install new software)

           

          c)下載EPIC插件之下載 


          d)EPIC設置(菜單windows->preferences)

           

          c)下載perl模塊PadWalker (用來在debug時顯示變量值)

           ppm install PadWalker 或cpan> install PadWalker (注意模塊名字的大小寫)

          d)運行和調試perl 

           

           

          完! 

          posted @ 2015-06-10 15:01 Eric_jiang 閱讀(322) | 評論 (0)編輯 收藏

          僅列出標題
          共57頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 固原市| 东安县| 象州县| 绥德县| 宜黄县| 鸡泽县| 中卫市| 绥阳县| 磴口县| 察隅县| 济阳县| 谢通门县| 友谊县| 安陆市| 浦县| 名山县| 南昌县| 绥芬河市| 乐昌市| 蓬安县| 营山县| 田阳县| 济宁市| 仙游县| 静安区| 乌鲁木齐县| 三亚市| 左权县| 若羌县| 当涂县| 中宁县| 博兴县| 冀州市| 五家渠市| 永仁县| 科技| 大悟县| 老河口市| 和田县| 娱乐| 丰原市|