Java程序員最常用的Linxu命令

大家都知道,Linux系統提供了非常多非常多的命令或工具,這些命令都各有所長,都是系統需要的。但我們精力有限,要掌握全部的命令不太現實,所以只需要掌握其中部分常用的命令即可。這裏,我就從一個Java程序員的角度,總結出我常用的一些Linxu命令,供大家參考。

文件目錄基本操作

  • ls 命令用來顯示目標列表,在Linux中是使用率較高的命令。ls命令的輸出信息可以進行彩色加亮顯示,以分區不同類型的文件。

  • 常用選項:

    ls(選項)(參數)
    -a 顯示所有檔案及目錄(ls默認不會列出隱藏文件);
    -l 所有輸出信息用單列格式輸出,不輸出爲多列;
    --color[=WHEN]:使用不同的顏色高亮顯示不同類型的。

    實際應用時,我經常會使用ls -l --color=auto,並給它指定一個別名ll:

    alias ll='ls -l --color=auto'

    效果如圖1:

    圖1


  • cd 用來切換工作目錄至dirname。 其中dirname表示法可爲絕對路徑或相對路徑。若目錄名稱省略,則變換至使用者的home directory。

  • 常用選項:

    cd   進入用戶主目錄
    cd ~ 進入用戶主目錄
    cd - 返回進入此目錄之前所在的目錄
    cd .. 返回上級目錄(若當前目錄爲“/“,則執行完後還在“/";".."爲上級目錄的意思)
    cd ../.. 返回上兩級目錄
    cd !$ 把上個命令的參數作爲cd參數使用


  • mkdir 創建目錄。該命令創建由dirname命名的目錄。如果在目錄名的前面沒有加任何路徑名,則在當前目錄下創建由dirname指定的目錄;如果給出了一個已經存在的路徑,將會在該目錄下創建一個指定的目錄。

  • 常用選項:

    -p 若所要建立目錄的上層目錄目前尚未建立,則會一併建立上層目錄


  • rm 刪除一個目錄中的一個或多個文件或目錄,也可以將某個目錄及其下屬的所有文件及其子目錄均刪除掉。對於鏈接文件,只是刪除整個鏈接文件,而原有文件保持不變。

  • 常用選項:

    -f:強制刪除文件或目錄
    -i:刪除已有文件或目錄之前先詢問用戶
    -r或-R:遞歸處理,將指定目錄下的所有文件與子目錄一併處理

    注意:使用rm命令要格外小心。因爲一旦刪除了一個文件,就無法再恢復它。

  • cp 將一個或多個源文件或者目錄複製到指定的目的文件或目錄。

  • 常用選項:

    -f:強行復制文件或目錄,不論目標文件或目錄是否已存在
    -i:覆蓋既有文件之前先詢問用戶
    -R/r:遞歸處理,將指定目錄下的所有文件與子目錄一併處理

    示例:

    cp /home/sre/tom.log .   將文件/home/sre/tom.log複製到當前目錄
    cp -r katarina  /home/sre/logs/ 將目錄katarina複製到/home/sre/logs/目錄下


  • mv 對文件或目錄重新命名,或者將文件從一個目錄移到另一個目錄中。source表示源文件或目錄,target表示目標文件或目錄。如果將一個文件移到一個已經存在的目標文件中,則目標文件的內容將被覆蓋。

  • 常用選項:

    -f:若目標文件或目錄與現有的文件或目錄重複,則直接覆蓋現有的文件或目錄
    -u:當源文件比目標文件新或者目標文件不存在時,才執行移動操作

    示例:

    mv katarina/* logs/ 將目錄katarina下所有文件複製到目錄logs下


  • pwd 以絕對路徑的方式顯示用戶當前工作目錄

  • 如圖2:

    圖2


  • tree 以樹狀圖列出目錄的內容

  • 如圖3

    圖3


  • touch 兩個功能:一是創建新的空文件;二是用於把已存在文件的時間標籤更新爲系統當前的時間(默認方式),它們的數據將原封不動地保留下來。

  • 示例:

    touch /var/wd/logs/touch.txt 創建空文件/var/wd/logs/touch.txt


  • chmod 變更文件或目錄的權限。在UNIX系統家族裏,文件或目錄權限的控制分別以讀取、寫入、執行3種一般權限來區分,另有3種特殊權限可供運用。用戶可以使用chmod指令去變更文件與目錄的權限,設置方式採用文字或數字代號皆可。

  • 示例:

    chmod +x what_cpu_do.sh 給腳本what_cpu_do.sh增加可執行權限
    chmod u+x,g+w test  //爲文件test設置自己可以執行,組員可以寫入的權限


  • file 探測給定文件的類型。

  • 示例:

    [sre@CDVM-213017031 ~]$ file what_cpu_do.sh
    what_cpu_do.sh: Bourne-Again shell script text executable
    [sre@CDVM-213017031 ~]$ file logs
    logs: directory
    [sre@CDVM-213017031 ~]$ file network_last.log
    network_last.log: empty
    [sre@CDVM-213017031 ~]$ file fix
    fix: directory


    文件內容查看


  • cat 連接文件並打印到標準輸出設備上,cat經常用來顯示文件的內容。

  • 示例:

    [sre@CDVM-213017031 ~]$ cat flow_of_network.sh | grep "RX_next"
    RX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
    RX=$((${RX_next}-${RX_pre}))


  • grep 是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。

  • 常用選項:

    -A<顯示列數> (After)除了顯示符合範本樣式的那一行之外,並顯示該行之後的內容
    -B (Before)在顯示符合範本樣式的那一行之外,並顯示該行之前的內容
    -C<顯示列數> 除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容
    -i 忽略字符大小寫。

    示例:

  • [sre@CDVM-213017031 ~]$ cat what_cpu_do.sh | grep "process of" -A 5 -B 5 (等效於 cat what_cpu_do.sh | grep "jstack" -C 5 )

 echo "checking pid($pid)"
fi

if test -z "$(jps -l | cut -d '' -f 1 | grep $pid)"
then
 echo "process of $pid is not exists"
 exit
fi

lineNum=$2
if test -z $lineNum
  • tail 輸出文件中的尾部內容,默認在屏幕上顯示指定文件的末尾10行。

  • 常用選項:

    -f:顯示文件最新追加的內容(查看服務器上動態刷新的日誌時經常使用)。
    -n:輸出文件的尾部N(N位數字)行內容

    示例:

    tail -100f /var/wd/logs/owl/owl.20170508.log 顯示文件/var/wd/logs/owl/owl.20170508.log中的後100行,並且當文件有更新顯示最新的內容。


  • head 顯示文件的開頭的內容。在默認情況下,head命令顯示文件的頭10行內容。

  • 常用選項:

    -n<數字>:指定顯示頭部內容的行數
    -c<字符數>:指定顯示頭部內容的字符數
    -v:總是顯示文件名的頭信息
    -q:不顯示文件名的頭信息


  • more 一個基於vi編輯器文本過濾器,它以全屏幕的方式按頁顯示文本文件的內容,支持vi中的關鍵字定位操作。more名單中內置了若干快捷鍵,常用的有H(獲得幫助信息),Enter(向下翻滾一行),空格(向下滾動一屏),Q(退出命令)。

  • 常用選項:

    Space鍵:顯示文本的下一屏內容
    Enter鍵:只顯示文本的下一行內容
    斜線符/:接着輸入一個模式,可以在文本中尋找下一個相匹配的模式
    h鍵:顯示幫助屏,該屏上有相關的幫助信息
    b鍵:顯示上一屏內容
    q鍵:退出rnore命令


  • less 與more十分相似,都可以用來瀏覽文字檔案的內容,不同的是less命令允許用戶向前或向後瀏覽文件,而more命令只能向前瀏覽。用less命令顯示文件時,用PageUp鍵向上翻頁,用PageDown鍵向下翻頁。要退出less程序,應按q鍵。

  • wc 用來計算數字。利用wc指令我們可以計算文件的Byte數、字數或是列數。

常用選項:


  • -c:只顯示Bytes數
    -l:只顯示列數
    -w:只顯示字數


  • tr 對來自標準輸入的字符進行替換、壓縮和刪除。它可以將一組字符變成另一組字符,經常用來編寫優美的單行命令,作用很強大。

  • 常用選項:

    -c:取代所有不屬於第一字符集的字符
    -d:刪除所有屬於第一字符集的字符
    -s:把連續重複的字符以單獨一個字符表示

    示例:

    echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world  將輸入字符由大寫轉換爲小寫
    hello world
    echo "hello 123 world 456" | tr -d '0-9' hello world 使用tr刪除字符
    hello world


  • sort 將文件進行排序,並將排序結果標準輸出。它可以從特定的文件,也可以從stdin中獲取輸入。

  • 常用選項:

    -d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符
    -f:排序時,將小寫字母視爲大寫字母
    -k:  來指定列數
    -r:以相反的順序來排序來自

    示例:

    [sre@CDVM-213017031 ~]$ ps -mp 25211 -o THREAD,tid,time | sort -r -k 2
    USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
    sre       8.8   -    - -         -      -     - 4-04:00:56
    sre       5.4  19    - futex_    -      - 25485 2-13:59:26
    sre       0.8  19    - futex_    -      - 16755 00:00:24
    sre       0.1  19    - ep_pol    -      - 25663 01:31:00
    sre       0.1  19    - ep_pol    -      - 25487 01:38:57
    sre       0.1  19    - ep_pol    -      - 25486 01:38:52
    sre       0.0  19    - skb_re    -      - 24586 00:00:00
    sre       0.0  19    - poll_s    -      - 25678 00:44:56
    sre       0.0  19    - poll_s    -      - 25676 00:00:00
    sre       0.0  19    - poll_s    -      - 25213 00:00:01
    sre       0.0  19    - futex_    -      -  7679 00:00:00
    sre       0.0  19    - futex_    -      -  5952 00:00:00

    上述命令功能:查看進程(pid爲25211)佔用CPU資源最多的線程信息(根據CPU佔用率倒序排列)。

  • 文件查找與比較

        find 在指定目錄下查找文件。任何位於參數之前的字符串都將被視爲欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。
示例:


  • find /home -name "*.txt"  在/home目錄下查找以.txt結尾的文件名
    find /home -iname "*.txt" 同上,但忽略大小寫
    find /home ! -name "*.txt"  找出/home下不是以.txt結尾的文件


  • which 查找並顯示給定命令的絕對路徑,環境變量PATH中保存了查找命令時需要遍歷的目錄。which指令會在環境變量$PATH設置的目錄裏查找符合條件的文件。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。

示例:

[sre@CDVM-213017031 ~]$ which java
/usr/java/default/bin/java
[sre@CDVM-213017031 ~]$ which pwd
/bin/pwd
[sre@CDVM-213017031 ~]$ which python
/usr/bin/python


  • whereis 用來定位指令的二進制程序、源代碼文件和man手冊頁等相關文件的路徑。

  • 和find相比,whereis查找的速度非常快,這是因爲linux系統會將 系統內的所有文件都記錄在一個數據庫文件中,當使用whereis和下面即將介紹的locate時,會從數據庫中查找數據,而不是像find命令那樣,通 過遍歷硬盤來查找,效率自然會很高。
    示例:

    [sre@CDVM-213017031 ~]$ whereis python
    python: /usr/bin/python /usr/bin/python2.6 /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
    [sre@CDVM-213017031 ~]$ whereis lua
    lua: /usr/bin/lua /usr/lib64/lua /usr/share/lua /usr/share/man/man1/lua.1.gz
    [sre@CDVM-213017031 ~]$ whereis java
    java: /usr/bin/java


  • locate locate命令其實是find -name的另一種寫法,但是要比後者快得多,原因在於它不搜索具體目錄,而是搜索一個數據庫/var/lib/locatedb,這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,並且自動更新,由於更新非實時,所以使用locate命令查不到最新變動過的文件。爲了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。
    示例:

    locate /etc/sh  搜索etc目錄下所有以sh開頭的文件
    locate -i ~/m 搜索用戶主目錄下,所有以m開頭的文件,並且忽略大小寫


  • tar tar命令可以爲linux的文件和目錄創建檔案。
    常用選項:

    -c:建立新的備份文件
    -z:通過gzip指令處理備份文件
    -v:顯示指令執行過程
    -f:指定備份文件
    -x:從備份文件中還原文件

    示例:

    tar -cvf log.tar log2012.log 僅打包,不壓縮!
    tar -zcvf log.tar.gz log2012.log 打包後,以 gzip 壓縮 
    tar -jcvf log.tar.bz2 log2012.log 打包後,以 bzip2 壓縮


  • zip 可以用來解壓縮文件,或者對文件進行打包操作。


  • unzip 加壓縮.zip包,不在詳述。
    另外,關於壓縮、解壓縮命令還有gzip、gunzip、bzip2、bunzip2等,讀者如果感興趣,可自行搜索瞭解。


  • 進程管理

    ps 用於報告當前系統的進程狀態,是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。
    由於ps命令能夠支持的系統類型相當的多,所以選項多的離譜!我主要使用:

    [sre@CDVM-213017031 ~]$ ps aux | grep "sudo"
    sre       9524  0.0  0.0 103252   832 pts/1    S+   16:16   0:00 grep sudo
    root     19503  0.0  0.0 189992  2996 pts/1    S    13:37   0:00 sudo su - sre
    root     22710  0.0  0.0 189992  3000 pts/0    S    11:42   0:00 sudo su - sre

    以及上文提到的:

    ps -mp 25211 -o THREAD,tid,time | sort -r -k 2


  • kill 命令用來刪除執行中的程序或工作。kill可將指定的信息送至程序。預設的信息爲SIGTERM(15),可將指定程序終止。若仍無法終止該程序,可使用SIGKILL(9)信息嘗試強制刪除程序。程序或工作的編號可利用ps指令或job指令查看。

常用選項:

kill -9 強制終止進程
kill -15 正常終止進程


具有相似功能的命令,還有killall、pkill等。


watch 以週期性的方式執行給定的指令,指令輸出以全屏方式顯示。
常用選項:


  • -n:指定指令執行的間隔時間(秒)
    -d:高亮顯示指令輸出信息不同之處
    -t:不顯示標題。


    示例:

watch ss
Every 2.0s: ssMon May  8 16:23:58 2017

State       Recv-Q Send-Q      Local Address:Port          Peer Address:Port
ESTAB       0      0         ::ffff:10.213.17.31:45473       ::ffff:10.213.18.49:10994
ESTAB       0      0         ::ffff:10.213.17.31:30046     ::ffff:10.209.19.143:10117
ESTAB       0      0         ::ffff:10.213.17.31:11233     ::ffff:10.209.26.154:10118
ESTAB       0      0         ::ffff:10.213.17.31:55524       ::ffff:10.209.33.69:eforward
ESTAB       0      0         ::ffff:10.213.17.31:56865       ::ffff:10.209.18.34:10218
ESTAB       0      0         ::ffff:10.213.17.31:25608     ::ffff:10.209.19.144:10117
ESTAB       0      0         ::ffff:10.213.17.31:19649       ::ffff:10.209.18.64:10620
  • service service命令是Redhat Linux兼容的發行版中用來控制系統服務的實用工具,它以啓動、停止、重新啓動和關閉系統服務,還可以顯示所有系統服務的當前狀態。
    服務名:自動要控制的服務名,即/etc/init.d目錄下的腳本文件名
    示例:

    service mysqld status 
    mysqld (pid 1638) 正在運行... 
    service mysqld restart 
    停止 MySQL: [ 確定 ] 
    啓動 MySQL: [ 確定 ]


    網絡操作


  • curl  curl命令是一個利用URL規則在命令行下工作的文件傳輸工具。它支持文件的上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱curl爲下載工具。

  • wget wget命令用來從指定的URL下載文件。
    示例:

    wget http://www.yourserverip.net/testfile.zip 下載文件


  • ping 用來測試主機之間網絡的連通性。

    [sre@CDVM-213017031 ~]$ ping www.wanda.cn
    PING www.wanda.cn (10.199.8.10) 56(84) bytes of data.
    64 bytes from 10.199.8.10: icmp_seq=1 ttl=244 time=50.8 ms
    64 bytes from 10.199.8.10: icmp_seq=2 ttl=244 time=51.8 ms
    64 bytes from 10.199.8.10: icmp_seq=3 ttl=244 time=51.0 ms
    64 bytes from 10.199.8.10: icmp_seq=4 ttl=244 time=53.3 ms


  • telnet  用於登錄遠程主機,對遠程主機進行管理。我常用它來檢測端口。
    示例:

    [sre@CDVM-213017031 ~]$ telnet 10.213.17.32 10000
    Trying 10.213.17.32...
    telnet: connect to address 10.213.17.32: Connection refused
    [sre@CDVM-213017031 ~]$ telnet 10.213.17.32 10062
    Trying 10.213.17.32...
    Connected to 10.213.17.32.
    Escape character is '^]'.
    ^C
    Connection closed by foreign host.


  • nslookup 常用域名查詢工具,就是查DNS信息用的命令。
    示例:


[sre@CDVM-213017031 ~]$ nslookup www.baidu.com
Server:        10.209.11.13
Address:    10.209.11.13#53

Non-authoritative answer:
www.baidu.com    canonical name = www.a.shifen.com.
Name:    www.a.shifen.com
Address: 111.206.223.205
Name:    www.a.shifen.com
Address: 111.206.223.206
  • ss 用來顯示處於活動狀態的套接字信息。ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。但ss的優勢在於它能夠顯示更多更詳細的有關TCP和連接狀態的信息,而且比netstat更快速更高效。
    常用選項:

    -n:不解析服務名稱,以數字方式顯示
    -a:顯示所有的套接字
    -l:顯示處於監聽狀態的套接字
    -m:顯示套接字的內存使用情況
    -p:顯示使用套接字的進程信息
    -i:顯示內部的TCP信息;
    -t:只顯示tcp套接字
    -u:只顯示udp套接字

    示例:

    [sre@CDVM-213017031 ~]$ ss -t
    State       Recv-Q Send-Q                                                        Local Address:Port                                                            Peer Address:Port
    ESTAB       0      0                                                       ::ffff:10.213.17.31:45473                                                    ::ffff:10.213.18.49:10994
    ESTAB       0      0                                                       ::ffff:10.213.17.31:14073                                                    ::ffff:10.209.18.33:10620
    ESTAB       0      0                                                       ::ffff:10.213.17.31:30046                                                   ::ffff:10.209.19.143:10117
    ESTAB       0      0                                                       ::ffff:10.213.17.31:11233                                                   ::ffff:10.209.26.154:10118
    ESTAB       0      0                                                       ::ffff:10.213.17.31:20347                                                    ::ffff:10.209.18.64:10620
    ESTAB       0      0                                                       ::ffff:10.213.17.31:41799                                                    ::ffff:10.209.18.34:10620
    ESTAB       0      0                                                       ::ffff:10.213.17.31:39386                                                    ::ffff:10.209.33.70:10434
    ESTAB       0      0                                                       ::ffff:10.213.17.31:55524                                                    ::ffff:10.209.33.69:eforward
    ESTAB       0      0                                                       ::ffff:10.213.17.31:56865                                                    ::ffff:10.209.18.34:10218




  • nc nc是netcat命令的簡稱,都是用來設置路由器。我常用它來上傳文件到服務器,具體可參考 如何優雅的實現文件上傳或下載


  • ifconfig 用於配置和顯示Linux內核中網絡接口的網絡參數。用ifconfig命令配置的網卡信息,在網卡重啓後機器重啓後,配置就不存在。要想將上述的配置信息永遠的存的電腦裏,那就要修改網卡的配置文件了。

示例:

[sre@CDVM-213017031 ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr FA:16:3E:7E:55:D1
          inet addr:10.213.17.31  Bcast:10.213.23.255  Mask:255.255.248.0
          inet6 addr: fe80::f816:3eff:fe7e:55d1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31875618113 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28230970908 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:13949365053248 (12.6 TiB)  TX bytes:5198483437608 (4.7 TiB)

ifconfig eth0 down 關閉網卡eth0
ifconfig eht0 up 啓動網卡eth0
  • su 用於切換當前用戶身份到其他用戶身份,變更時須輸入所要變更的用戶帳號與密碼。

  • sudo 以其他身份來執行命令,預設的身份爲root。在/etc/sudoers中設置了可執行sudo指令的用戶。

  • du 查看使用空間。
    常用選項:

    -a 顯示目錄中個別文件的大小
    -b 顯示目錄或文件大小時,以byte爲單位
    -c 除了顯示個別目錄或文件的大小外,同時也顯示所有目錄或文件的總和
    -k 以KB(1024bytes)爲單位輸出
    -m 以MB爲單位輸出
    -s 僅顯示總計,只列出最後加總的值
    -h 以K,M,G爲單位,提高信息的可讀性

    示例:

    [sre@CDVM-213017031 ~]$ du -h *
    4.0K    a.sh
    1.7G    catalina.out
    317M    collect_sample
    632K    fix/plugin
    372K    fix/boot
    8.0K    fix/script
    41G    fix/log
    6.1M    fix/lib


  • top 可以實時動態地查看系統的整體運行情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具。通過top命令所提供的互動式界面,用熱鍵可以管理。

常用選項:

-d:屏幕刷新間隔時間
-u<用戶名>:指定用戶名
-p<進程號>:指定進程
-n<次數>:循環顯示的次數


交互命令:


1:顯示全部CPU信息
k:終止一個進程
i:忽略閒置和僵死進程,這是一個開關式命令
q:退出程序
o或者O:改變顯示項目的順序
m:切換顯示內存信息
t:切換顯示進程和CPU狀態信息
c:切換顯示命令名稱和完整命令行
M:根據駐留內存大小進行排序
P:根據CPU使用百分比大小進行排序
T:根據時間/累計時間進行排序


示例:


top -p 25211
top - 17:14:06 up 559 days,  4:54,  2 users,  load average: 0.06, 0.01, 0.00
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  6.8%us,  3.4%sy,  0.0%ni, 89.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4054588k total,  3916560k used,   138028k free,   114260k buffers
Swap:        0k total,        0k used,        0k free,   730196k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
25211 sre       20   0 4624m 1.9g   9m S 12.7 49.7   6014:18 java


上面是執行 top -p 25211後,單擊“1”後的效果。


free 顯示當前系統未使用的和已使用的內存數目,還可以顯示被內核使用的內存緩衝區。
常用選項:

-b:以Byte爲單位顯示內存使用情況
-k:以KB爲單位顯示內存使用情況
-m:以MB爲單位顯示內存使用情況
-t:顯示內存總和列


示例:


[sre@CDVM-213017031 ~]$ free -m
           total       used       free     shared    buffers     cached
Mem:          3959       3825        134          0        111        713
-/+ buffers/cache:       3000        959
Swap:            0          0          0


sar Linux下系統運行狀態統計工具,它將指定的操作系統狀態計數器顯示到標準輸出設備。sar工具將對系統當前的狀態進行取樣,然後通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣數據。取樣數據和分析的結果都可以存入文件,使用它時消耗的系統資源很小。我常用它查看網卡流量,具體請參考 Linux查看實時網卡流量的幾種方式。

lsof lsof命令用於查看你進程開打的文件,打開文件的進程,進程打開的端口(TCP、UDP)。
常用選項:


-a:列出打開文件存在的進程
-c<進程名>:列出指定進程所打開的文件
-p<進程號>:列出指定進程號所打開的文件


示例:


[sre@CDVM-213017031 ~]$ lsof | wc -l
1278
[sre@CDVM-213017031 ~]$ lsof | grep 10117 | wc -l
9
[sre@CDVM-213017031 ~]$ lsof | grep 10117
java        402          sre  143u     IPv6         1879294557        0t0        TCP CDVM-213017031:63449->10.209.19.143:10117 (ESTABLISHED)
java        402          sre  144u     IPv6         1879294563        0t0        TCP CDVM-213017031:63450->10.209.19.143:10117 (ESTABLISHED)
java        402          sre  145u     IPv6         1879294564        0t0        TCP CDVM-213017031:25608->10.209.19.144:10117 (ESTABLISHED)
java      11538          sre   43u     IPv6          720753145        0t0        TCP CDVM-213017031:30045->10.209.19.143:10117 (ESTABLISHED)
java      11538          sre   44u     IPv6          720753147        0t0        TCP CDVM-213017031:30046->10.209.19.143:10117 (ESTABLISHED)
java      11538          sre   45u     IPv6          720762177        0t0        TCP CDVM-213017031:47599->10.209.19.144:10117 (ESTABLISHED)
java      25211          sre  267u     IPv6         1855869958        0t0        TCP CDVM-213017031:54013->10.209.19.143:10117 (ESTABLISHED)
java      25211          sre  271u     IPv6         1855869959        0t0        TCP CDVM-213017031:16169->10.209.19.144:10117 (ESTABLISHED)
java      25211          sre  294u     IPv6         1855870096        0t0        TCP CDVM-213017031:54030->10.209.19.143:10117 (ESTABLISHED)


當程序報too many open files 異常時,可以使用它查看是什麼進程打開了太多的文件,主要查看是不是文件(包括網絡鏈接)打開後是不是沒有關閉,我之前的一個項目,就遇到了這種問題。


ulimit  用來限制系統用戶對shell資源的訪問。支持以下各種類型的限制:所創建的內核文件的大小、進程數據塊的大小、Shell 進程創建文件的大小、內存鎖住的大小、常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。
常用選項:

-a:顯示目前資源限制的設定
-n <文件數目>:指定同一時間最多可開啓的文件數
-u <程序數目>:用戶最多可開啓的程序數目


示例:


[sre@CDVM-213017031 ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31517
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 409600
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65535
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


vmstat 顯示虛擬內存狀態(“Viryual Memor Statics”),但是它可以報告關於進程、內存、I/O等系統整體運行狀態。
常用選項:


-a:顯示活動內頁
-f:顯示啓動後創建的進程總數
-m:顯示slab信息 
-n:頭信息僅顯示一次
-s:以表格方式顯示事件計數器和內存狀態
-d:報告磁盤狀態
-p:顯示指定的硬盤分區狀態
-S:輸出信息的單位。


示例:


[sre@CDVM-213017031 ~]$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 126316 114292 736992    0    0     1     4    0    0  1  1 98  0  0
1  0      0 126432 114292 736992    0    0     0     0 2289 4432  2  1 97  0  0
0  0      0 126480 114292 736992    0    0     0     0 2572 5132  2  1 97  0  0


  • iostat  監視系統輸入輸出設備和CPU的使用情況。它的特點是彙報磁盤活動統計情況,同時也會彙報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。
    常用選項:

    -c:僅顯示CPU使用情況
    -d:僅顯示設備利用率
    -k:顯示狀態以千字節每秒爲單位,而不使用塊每秒
    -m:顯示狀態以兆字節每秒爲單位
    -x:顯示擴展狀態

    示例:


[sre@CDVM-213017031 ~]$ iostat -x 1 2
Linux 2.6.32-431.el6.x86_64 (CDVM-213017031)     05/08/2017     _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.94    0.00    0.53    0.10    0.02   98.41

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
vda               0.01     2.69    0.11    1.30     9.02    32.13    29.09     0.05   34.90   5.07   0.72

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.77    0.00    2.27    0.00    0.25   94.71

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
vda               0.00     1.00    0.00    3.00     0.00    32.00    10.67     0.01    4.00   1.33   0.40

Java常用工具

  • java  可用來執行jar包。
    示例:

    java -jar test.jar


  • jps  jps是jdk提供的一個查看當前Java進程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的縮寫。非常簡單實用。
    常用選項:

    -l:輸出完全的包名,應用主類名,jar的完全路徑名 
    -v:輸出jvm參數

    示例:

    [sre@CDVM-213017031 ~]$ jps -l
    402 org.apache.flume.node.Application
    13466 sun.tools.jps.Jps
    11538 com.wanda.monitor.server.MonitorStartup
    25211 org.apache.catalina.startup.Bootstrap


  • jmap 打印出某個java進程內存中所有‘對象’的情況。
    常用選項:

    -dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那麼只輸出活的對象到文件. 
    -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
    -histo[:live] 打印每個class的實例數目,內存佔用,類全名信息. VM的內部類名字開頭會加上前綴”*”. 如果live子參數加上後,只統計活的對象數量.

    示例1,查看進程內存信息:


[sre@CDVM-213017031 ~]$ jmap -heap 25211
Attaching to process ID 25211, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2147483648 (2048.0MB)
   NewSize          = 348913664 (332.75MB)
   MaxNewSize       = 348913664 (332.75MB)
   OldSize          = 697892864 (665.5625MB)
   NewRatio         = 2
   SurvivorRatio    = 8
...

示例2,查看包com.wanda中的類創建的對象佔用內存信息:

[sre@CDVM-213017031 ~]$ jmap -histo 25211 | grep "com.wanda" | head -5
num     #instances         #bytes  class name
----------------------------------------------
  46:          4167         500040  com.wanda.arch.owl.domain.monitorelement.MIndicator
  63:          8192         327680  com.wanda.fix.org.jboss.netty.util.internal.ConcurrentIdentityHashMap$Segment
  73:          8192         262192  [Lcom.wanda.fix.org.jboss.netty.util.internal.ConcurrentIdentityHashMap$HashEntry;
 102:          1428         148512  com.wanda.arch.owl.domain.monitorelement.LComponent
 138:          2048          98304  com.wanda.fix.org.jboss.netty.util.internal.ConcurrentIdentityHashMap
  • jstat Jstat用於監控基於HotSpot的JVM,對其堆的使用情況進行實時的命令行的統計,使用jstat我們可以對指定的JVM做如下監控:
    類的加載及卸載情況,查看新生代、老生代及持久代的容量及使用情況,查看新生代、老生代及持久代的垃圾收集情況,包括垃圾回收的次數及垃圾回收所佔用的時間,查看新生代中Eden區及Survior區中容量及分配情況等。
    常用選項:

    -gcutil 用於查看新生代、老生代及持代垃圾收集的情況
    -class 用於查看類加載情況的統計

    示例:


[sre@CDVM-213017031 ~]$ jstat -gcutil 25211 5000 2
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00   4.82  82.82  58.15  60.00 197263 2435.605    72    1.186 2436.791
  5.36   0.00  28.22  58.16  60.00 197264 2435.620    72    1.186 2436.806

說明:
S0    Heap上的 Survivor space 0 區已使用空間的百分比
S1    Heap上的 Survivor space 1 區已使用空間的百分比
E    Heap上的 Eden space 區已使用空間的百分比
O    Heap上的 Old space 區已使用空間的百分比
P    Perm space 區已使用空間的百分比
YGC    從應用程序啓動到採樣時發生 Young GC 的次數
YGCT    從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)
FGC    從應用程序啓動到採樣時發生 Full GC 的次數
FGCT    從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)
GCT    從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒),它的值等於YGC+FGC
  • jstack  用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息。
    示例:


jstack 25211 > 25211.txt  將當前堆棧信息輸出到文件。

以上就是我常用的Linux命令,可能有一些常用的一時沒有想到,等到想到時再補充進來吧。
另外,文中 Java常用工具 中提到的幾個命令,尤其重要,尤其常用,特別是當你的程序上線以後,它能方便而快速的幫你定位問題,解決問題。


原文地址:http://www.jianshu.com/p/341bc031ea2b     作者:劉振鋒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章