開發必備linux命令大全-穩賺不虧

潛行前行發表於2021-07-18

我們的服務一般都是在linux系統執行,因此瞭解一些關於linux命令是必須。接下來將一一詳細介紹一些常用的linux的命令

  • 檔案操作
  • 遠端登入與操作
  • 磁碟掛載
  • 程式管理 啟動和結束
  • 系統效能引數檢視
  • 網路資料抓取
  • shell 指令碼命令
  • jvm 常用命令

關注公眾號,一起交流,微信搜一搜: 潛行前行

1 檔案操作命令

find

  • find 用於在指定目錄下查詢檔案或子目錄,如果不指定查詢目錄,則在當前目錄下查詢
  • 命令格式:·find path -option [-print] [ -exec/-ok command {} \ ] ;
    • print: 將匹配的檔案輸出到標準輸出
    • exec:對匹配的檔案作為引數 讓 command 命令執行。{} 是匹配檔案的佔位符
    • ok: 和 exec 的作用相同,但在執行命令之前,會給出提示,讓使用者來確定是否執行
常用的option 選項 | 描述
-mount     | 只檢查和指定目錄在同一個檔案系統下的檔案,避免列出其它檔案系統中的檔案
-amin n    | 在過去 n 分鐘內被讀取過
-atime n   | 在過去 n 天內被讀取過的檔案
-cmin n    | 在過去 n 分鐘內被修改過
-ctime n   | 在過去n天內被修改過的檔案
-gid n     | gid 是 n 檔案。或 -group name, group 名稱是 name 的檔案
-pid n     | pid 是 n 的檔案
-ipath p   | 路徑名稱符合 p 的檔案。或 -path p,ipath 會忽略大小寫
-name name | 檔名稱符合 name 的檔案。或者-iname name,iname 會忽略大小寫
-size n    | 檔案大小 是 n 單位,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組
-type c    | 檔案型別是c的檔案。 d: 目錄;f: 一般檔案;l: 符號連結;s: socket
  • find 示例
~~ 查詢 /var/log 目錄中更改時間在 7 日以前的普通檔案,並在刪除之前詢問它們
# find /var/log -type f -mtime +7 -ok rm {} \;

touch 和 vim

  • touch 可用於建立一個空檔案,如果檔案存在,則會更改檔案的訪問時間和修改時間
  • touch 示例
~~ #建立一個名為“file”的新的空白檔案,如果存在則會修改其時間屬性
# touch file             
  • vim Vim是從 vi 發展出來的一個文字編輯器,是在 linux 系統互動介面進行檔案檢視,編寫文字的首選工具

image.png

  • vim 共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和底線命令模式(Last line mode)
1 命令模式:使用者 vim fileName,便進入了命令模式
    i         切換到輸入模式,以輸入字元
    :         冒號切換到底線命令模式
    /word     向游標之下尋找一個名稱為 word 的字串
    ?word     向游標之上尋找一個字串名稱為 word 的字串
    n         重複前一個搜尋(與 / 或 ? 有關)
    N         反向重複前一個搜尋(與 / 或 ? 有關)
    PageUp    上翻頁
    PageDown  下翻頁
    G	      移動到這個檔案的最後一行(常用)
    nG	      n 為數字。移動到這個檔案的第 n 行
    
2 輸入模式: 在命令模式下按下i就進入了輸入模式; ESC 退出輸入模式,切換到命令模式
    字元按鍵、shift組合    輸入字元
    ENTER                 Enter鍵,換行
    BACK SPACE            退格鍵,刪除游標前一個字元
    DEL                   刪除鍵,刪除游標後一個字元
    方向鍵                在文字中移動游標
    HOME/END              移動游標到行首/行尾
    Page Up/Page Down     上/下翻頁
    Insert                切換游標為輸入/替換模式,游標將變成豎線/下劃線

3 底線命令模式: 在命令模式下按下 ":" 就進入了底線命令模式; ESC退出模式,切換到命令模式
    :q                 退出 vim 程式
    :w                 儲存檔案
    :wq                儲存後離開
    :!q                不儲存退出
    :w [filename]      將編輯的資料儲存成另一個檔案
    :r [filename]      在編輯的資料中,讀入另一個檔案的資料。追加到遊標所在行後面
    :!ShellCommand     暫時離開 vi 到指令行模式下執行 shellCommand 的顯示結果
    :%s/word1/word2/g  從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 
    :%s/word1/word2/gc 和 %s/word1/word2/g 功能一致,不過每次替換都需使用者確認  

less、cat、more、tail 和 head

  • less 是linux 必不可少的檢視檔案工具,功能極其強大
less [option] 檔案
option 常用引數
-f 強制開啟檔案,二進位制檔案顯示時,不提示警告;
-i 搜尋時忽略大小寫;除非搜尋串中包含大寫字母;
-I 搜尋時忽略大小寫,除非搜尋串中包含小寫字母;
-m 顯示讀取檔案的百分比;
-M 顯法讀取檔案的百分比、行號及總行數;
-N 在每行前輸出行號;
-p pattern 搜尋 pattern;比如在/etc/profile搜尋單詞MAIL,就用 less -p MAIL /etc/profile
-s 把連續多個空白行作為一個空白行顯示;
  • less 檔案後可進行的動作操作和 vim 在命令模式下的操作相似;less在檢視文字時的常用動作命令如下
Enter      向下移動一行
y          向上移動一行
Space      向下滾動一屏
b          向上滾動一屏
d          向下滾動半屏
u          向上滾動半屏
g          跳到第一行
G          跳到最後一行
/pattern   向下搜尋pattern ,比如 /MAIL 表示在檔案中搜尋MAIL單詞
?pattern   向上搜尋pattern 
n          重複前一個搜尋(與 / 有關)
N          反向重複前一個搜尋(與 / 有關)
v          呼叫 vi 編輯器
q          退出 less
!command   呼叫 shell 命令;比如 !ls 顯示當前目錄下的所有檔案
  • more 常用於顯示輸出的內容,然後根據視窗的大小進行分頁顯示,然後還能提示檔案的百分比。命令格式:more 檔案,more 常用操作指令如下
Enter        向下n行,需要定義,預設為1行;
Ctrl+f       向下滾動一屏
空格鍵        向下滾動一屏
Ctrl+b       返回上一屏
=            輸出當前行的行號
:f           輸出檔名和當前行的行號
v            當我們檢視某一檔案時,想呼叫vi來編輯它,用 v 動作指令
!command     呼叫 shell,並執行command命令
q            退出 more
  • cat 常用於連線檔案並列印到標準輸出裝置上,也可用於檢視檔案。格式: cat fileName [| command ] ,command 預設是 echo,cat會一次性顯示整個檔案的內容,不分頁
  • head 是顯示一個檔案的內容的前多少行;常用命令格式:head -n 行數值 檔名
  • tail 是顯示一個檔案的內容的後多少行;常用命令格式:tail -n 行數值 檔名

grep、zgrep

  • grep 一般用於在檔案中查和匹配模式匹配的每一行資料。命令格式 grep [options] 'pattern' [files];grep 支援處理管道的輸出資料; pattern 支援正規表示式;files 可以是多個檔案,用空格分開
  • grep 無法在壓縮檔案匹配查詢數,此時可以用 zgrep,zgrep 適用處理壓縮後的gz等格式檔案
options選項 | 功能描述
-i	|	忽略大小寫
-v	|	不匹配匹配的
-l	|	輸出匹配的檔名
-L	|	輸出不匹配的檔名
-c	|	輸出匹配的數目(行數)
-C num  |       輸出匹配的前後 num 條行數
-n	|	輸出匹配行的同時在前面加上檔名及在檔名中的行數
  • grep 和 zgrep 示例
~~ 輸出匹配 lwl 資料,及前後十行
# grep -C 10 'lwl' log.txt 

cp

  • 檔案目錄複製可用使用 cp 命令。cp 格式:cp [選項引數] fileSource... fileTarget
cp 選項引數 | 描述
-a | 此選項通常在複製目錄時使用,它保留連結、檔案屬性,並複製目錄下的所有內容
-r | 若給出的原始檔是一個目錄檔案,此時將複製該目錄下所有的子目錄和檔案
-f | 覆蓋已經存在的目標檔案而不給出提示。
-i | 與 -f 選項相反,在覆蓋目標檔案之前給出提示,要求使用者確認是否覆蓋,回答 y 時目標檔案將被覆蓋
-l | 不復制檔案,只是生成連結檔案
  • cp 示例
~~ 將當前目錄 csc/ 下的所有檔案複製到新目錄 lwl 下
# cp –r csc/ lwl 

mv

  • mv 可用來移動資料夾、檔案 或者 修改檔名、目錄名
option 引數 | 描述
-b | 當目標檔案存在時,先進行備份再覆蓋
-f | 當目標檔案存在時,強制覆蓋
-i | 預設選項,當目標檔案存在時,提示是否覆蓋
-t | 先指定目標,再指定源目標。即目標 和 源目標 引數位置互換
  • mv 示例
~~ 把 csc.txt 修改名字為 lwl.txt
# mv csc.txt lwl.txt
~~ 將 csc 目錄下的檔案移到 lwl 下
# mv csc/ lwl 

rm

  • rm 命令用於刪除一個檔案或者目錄;命令格式 rm [options] fileName/filePath
option引數 | 描述
-i | 刪除前逐一詢問確認
-f | 即使原檔案屬性設定為只讀,也可強制刪除,無需確認
-r | 將目錄及以下之檔案亦逐一刪除
  • rm 示例
~~ 刪除檔名 test.txt
# rm  -rf   test.txt

mdkir

  • mdkir命令用於建立目錄, mkdir [-p] dirName; -p 確保目錄名稱存在,不存在的就建一個

tar 和 jar

  • tar 的命令格式:tar [-option] fileName/filePath;tar具有打包和壓縮功能,普通檔案和資料夾可以被打包成 xxx.tar,如果要壓縮,則是在打包之後再壓縮,格式是 xxx.tar.gz
tar [-cxtzjvfpPN] 檔案與目錄
常用引數:描述
-c :建立一個壓縮檔案 
-x :解開一個壓縮檔案
-t :檢視tarfile 裡面的檔案!特別注意,c/x/t 僅能存在一個,不可同時存在
-z :用 gzip 解壓縮
-j :用 bzip2 解壓縮
-v :壓縮的過程中顯示檔案,這個常用,但不建議用
-f :使用檔名,在 f 之後要立即接檔名!例如使用『 tar -zcfv tfile sfile』就是錯誤的寫法,要寫成 『tar -zcvf tfile sfile』才對喔
-p :使用原檔案的原來屬性(屬性不會依據使用者而變)
-P :(大寫P)使用絕對路徑來壓縮
-r : 新增檔案到已存在的備份檔案的結尾部分
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔案中
--exclude file :在壓縮的過程中,不要將 FILE 打包
  • tar 示例
~~ 打包不壓縮:/home/lwl 目錄
# tar -cvf lwl.tar /home/lwl
~~ 打包並壓縮:/home/lwl 目錄
# tar zcvf lwl.tar.gz /home/lwl
~~ 解壓 lwl.tar.gz
# tar zxvf lwl.tar.gz

~~ 壓縮 lwl.java 為 bz2 格式
# tar jcvf lwl.tar.bz2 lwl.java
~~ 解壓 lwl.tar.bz2
# tar jxvf lwl.tar.bz2

~~ 解壓部分檔案 log2021.log
# tar -zxvf log.tar.gz log2021.log
  • jar 的命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目錄] fileName;其中{ ctxu }這四個選項必須選其一。[ v f m e 0 M i ]是可選選項,檔名是必須的
jar {c t x u f }[ v m e 0 M i ][-C 目錄] fileName 
jar 的選項引數和 tar 差不多,如下

-c :建立一個jar包
-t :顯示jar中的內容列表
-x :解壓jar包
-u :新增檔案到jar包中
-f :指定jar包的檔名
-v :生成詳細的報造,並輸出至標準裝置
-m :指定manifest.mf檔案.(manifest.mf 檔案中可以對jar包及其中的內容作一些一設定)
-0 :產生jar包時不對其中的內容進行壓縮處理
-M :不產生所有檔案的清單檔案(Manifest.mf)。這個引數會忽略掉 -m 引數的設定
-i :為指定的jar檔案建立索引檔案
-C :表示轉到相應的目錄下執行jar命令,相當於cd到那個目錄,然後不帶-C執行jar命令
  • jar 示例
~~ 利用hello目錄建立 hello.jar 包,並顯示建立過程
# jar cvf hello.jar hello
~~ 往 jar 包新增檔案,將 HelloWorld.java 新增到 hello.jar 包中
# jar uf hello.jar HelloWorld.java    
~~  解壓 hello.jar 至當前目錄
# jar xvf hello.jar  

chmod

  • chmod 是控制使用者對檔案的許可權的命令, 命令格式: chmod [-cfvR] mode file
    1626575501(1).jpg
## -cfvR 引數解析
-c : 若該檔案許可權確實已經更改,才顯示其更改動作
-f : 若該檔案許可權無法被更改也不要顯示錯誤訊息
-v : 顯示許可權變更的詳細資料
-R : 對目前目錄下的所有檔案與子目錄進行相同的許可權變更(即以遞迴的方式逐個變更)

## mode [ugoa][+-=][rwxX-] 引數解析
u 表示該檔案的擁有者
g 表示與該檔案的擁有者屬於同一個群體(group)者
o 表示其他以外的人
a 包扣 u g o
## [+-=]
+ 表示增加許可權
- 表示取消許可權
= 表示唯一設定許可權
## [rwxX-]
r 表示可讀取
w 表示可寫入
x 表示可執行
X 只有當檔案為目錄檔案,或者其他型別的使用者有可執行許可權時,才將檔案許可權設定可執行
- 不具任何許可權
  • chmod 示例
# chmod ugo+r lwl.txt
# chmod ug+w,o-w csc.txt lwl.txt

ln

  • 命令格式:ln [options] [原始檔或目錄] [目標檔案或目錄];當我們需要在不同的目錄,用到相同的檔案時,又不想浪費空間複製相同的檔案,可以用ln 連結它,相當建立一個快捷圖示
options 引數 | 描述
-b | 刪除,覆蓋以前建立的連結
-d | 允許超級使用者製作目錄的硬連結
-f | 強制執行
-i | 互動模式,檔案存在則提示使用者是否覆蓋
-n | 把符號連結視為一般目錄
-s | 軟連結(符號連結)
  • 軟連結: 以路徑的形式存在。類似於Windows作業系統中的快捷方式;可以對一個不存在的檔名進行連結;可以對目錄進行連結;軟連結可以 跨檔案系統 ,硬連結不可以
  • 硬連結: 以檔案副本的形式存在。但不佔用實際空間;不允許給目錄建立硬連結;硬連結只有在同一個檔案系統中才能建立
  • ln 示例
~~ 給檔案建立軟連結,log2021.log檔案建立軟連結log2021,如果log2021.log丟失,log2021將失效
# ln -s log2021.log link2021

2 遠端登入與操作

ssh

  • linux下的ssh服務是一個守護程式(demon),ssh 服務端的程式名為 sshd ,負責實時監聽客戶端的請求(預設22埠),包括公共祕鑰等交換等資訊。ssh的客戶端可以用 xShell,Securecrt, Mobaxterm等工具進行連線,也可以在 linux 命令視窗使用 ssh 命令連線 ssh 服務端
  • 命令格式:ssh [-p port] user@remoteIp 或者 ssh [-p port] user@remoteIp shellCommand ; 會提示輸入密碼
  • ssh示例
~~ 登入 192.168.25.137 ,並執行 ls /backup/data
# ssh root@192.168.25.137 ls /backup/data

sftp

  • 登入sftp伺服器 sftp -oPort=23 user@remoteIp
~~ 上傳,第一個目錄是本機的, 第二個引數遠端的    
> put /etc/hosts /home/lwl   
~~ 下載,第一個目錄是遠端的, 第二個引數是本機的
> get /home/lwl /home/csc  

scp

  • 如果是涉及不同linux系統間的檔案複製則用 scp, 格式: scp [options] fileSource fileTarget
options 選項引數 | 描述

-P | port:注意是大寫的P, port是指定資料傳輸用到的埠號
-p | 保留原檔案的修改時間,小寫p,訪問時間和訪問許可權
-r | 遞迴複製整個目錄
-C | 允許壓縮。(將-C標誌傳遞給ssh,從而開啟壓縮功能)
  • scp 示例
~~ 從本地複製到遠端 
~~ A 格式: scp localFile username@remoteIp:filePath; B 格式:scp localFile remoteIp:filePath 
~~ A 命令指定了使用者名稱,但命令執行後需要輸入密碼,B 格式則需要輸入使用者名稱和密碼
# scp -r /home/lwl/ root@www.csc.com:/home/lwl/ 

~~ 從遠端複製到本地 
~~ 格式:scp remoteIp:filePath localFile
# scp -r www.csc.com:/home/lwl/ /home/lwl/

檔案同步 rsync

  • 與其他檔案傳輸工具(如 FTP 或 scp)不同,和 scp 功能類似。 rsync 的最大特點是會檢查傳送方和接收方已有的檔案
# rsync -r source destination

linux與客戶端的上傳下載命令:rz、sz

  • 用 ssh 管理 linux 伺服器時經常需要遠端與 win 本地之間互動檔案。直接用SecureCRT自帶的上傳下載功能無疑是最方便的。上傳:rz、下載:sz
  • 在 window 上使用SecureCRT、XShell 軟體,用 rz、sz 進行上傳下載
~~ 上傳檔案到linux;彈出SecureCRT上傳視窗,用SecureCRT來上傳
# rz    
~~ 下載檔案到客戶端(window)
# sz filename

3 磁碟掛載

df

  • df 用於檢視磁碟空間佔用情況:df [-options] [file]
options 引數解釋

-i                   顯示inode資訊
-h                   方便閱讀方式顯示
-k                   區塊為1024位元組
-m                   區塊為1048576位元組
-a                   全部檔案系統列表
-T                   顯示檔案系統型別
-t<檔案系統型別>      只顯示選定檔案系統的磁碟資訊
-x<檔案系統型別>      不顯示選定檔案系統的磁碟資訊
  • df 示例
# df -hT
檔案系統          型別            容量  已用  可用 已用% 掛載點
devtmpfs          devtmpfs         63G     0   63G    0% /dev
tmpfs             tmpfs            63G     0   63G    0% /dev/shm
tmpfs             tmpfs            63G  4.1G   59G    7% /run
tmpfs             tmpfs            63G     0   63G    0% /sys/fs/cgroup

mount

  • mount 命令是經常會使用到的命令,它用於掛載Linux系統外的檔案
命令格式:mount [-t vfstype] [-o options] device dir
1、-t vfstype 指定檔案系統的型別,通常不必指定,mount 會自動選擇正確的型別
iso9660 : 光碟或光碟映象 
msdos   : DOS fat16檔案系統 
vfat    : Windows 9x fat32檔案系統
ntfs    : Windows NT ntfs檔案系統
smbfs   : Mount Windows檔案網路共享
nfs     :UNIX(LINUX) 檔案網路共享

2、-o options 主要用來描述裝置或檔案的掛接方式
loop      :用來把一個檔案當成硬碟分割槽掛接上系統 
ro        :採用只讀方式掛接裝置 
rw        :採用讀寫方式掛接裝置 
iocharset :指定訪問檔案系統所用字符集

3、device 要掛接(mount)的裝置

4、dir裝置在系統上的掛接點(mount point)
  • mount 示例
~~ 1 掛接U盤,/dev/sdd1 是 U 盤裡的磁碟分割槽
# mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb

~~ 2 掛接Windows檔案共享
~~ administrator 和 pldy123 是ip地址為10.140.133.23 windows計算機的一個使用者名稱和密碼,c$是這臺計算機的一個磁碟共享
# mount -t smbfs -o username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba

~~ 3 linux 掛接(mount)其他linux系統 NFS 共享 
/export/home/sunky 10.140.133.23(rw)  ~~ 在服務端 /etc/exports檔案配置共享目錄
~~ 在服務端啟動 nfs 服務
/etc/rc.d/init.d/nfs start 啟動NFS服務 
/etc/rc.d/init.d/nfs stop 停止NFS服務
~~ linux 客戶端掛接 NFS 共享
# mount -t nfs -o rw 10.140.133.9:/export/home/sunky /mnt/nfs

4 程式管理 啟動和結束

systemctl 和 service

  • service 命令本身是一個shell指令碼,它會在 /etc/init.d/ 目錄查詢指定的服務指令碼,然後呼叫該服務指令碼來完成任務;service命令用於對系統服務進行管理,比如啟動(start)、停止(stop)、重啟(restart)、檢視狀態(status)等。命令格式:service 服務名 [start|stop|restart|reload|status]
~~ service 命令: 停止、啟動、檢視 redis服務
# service redis stop   ~~ 等於在 /etc/init.d/ 目錄下執行 ./redis stop
# service redis start  ~~ 等於在 /etc/init.d/ 目錄下執行 ./redis start
# service redis status ~~ 等於在 /etc/init.d/ 目錄下執行 ./redis status
  • systemctl 命令相容了 service 命令,且包含其他更強大功能
  • systemctl 用來管理 linux系統的多種資源:系統服務、硬體裝置、掛載點、socket等;下面則主要介紹關於 service 系統服務的相關命令使用。因為 systemctl 一般用於實現服務自啟動的指令碼
~~ 系統自啟動時 啟動 cron 服務,啟用或禁用它
# systemctl enable crond.service
# systemctl disable ccrond.service
# systemctl is-active crond.service  ~~ 是否正在執行
# systemctl is-enabled crond.service ~~  是否建立了啟動連結

~~ 啟動、重啟、停止、過載、殺死服務以及檢視服務 httpd
# systemctl start httpd.service
# systemctl restart httpd.service
# systemctl stop httpd.service
# systemctl reload httpd.service
# systemctl status httpd.service
# systemctl kill apache.service

~~ 列出所有服務(包括啟用的和禁用的)
# systemctl list-units      ~~  列出所有管理的資源單元
# systemctl list-unit-files --type=service   ~~ 只列出所有 service 型別資源

~~ 獲取某個服務(httpd)的依賴性列表
# systemctl list-dependencies httpd.service

~~ 檢查 httpd 服務的所有配置細節
# systemctl show httpd
  • xxx.service 檔案的詳細配置介紹請上網自行檢視,下面給個簡單的模板介紹
[Unit]
Description:描述
After:auditd.service 在auditd.service啟動後才啟動
ConditionPathExists: 執行條件

[Service]
EnvironmentFile: 變數所在檔案
ExecStart: 執行啟動命令
Restart: fail時重啟

[Install]
Alias:服務別名
WangtedBy: 多使用者模式下需要的

nohup 和 &

  • nohup 和 & 組合可以不結束通話地在後臺執行程式,命令格式:nohup command [agrs..] [&]。& 表示程式可以在linux 後臺執行,在當前 shell 介面 ctrl C 退出,該程式也能繼續執行,它可以忽略 SIGINT 訊號,不過它會隨著 shell 程式的關閉而停止,這是因為 & 執行的程式對 SIGHUP 訊號不免疫
  • 加上 nohup 就可以做到忽略SIGHUP訊號
~~ 在後臺執行 lwl.py,且不隨著 shell 關閉而死亡。永遠存在
# nohup python lwl.py &> /var/log/lwl.log &

kill

  • 如果在linux遇到需要殺死或停止某程式,可以使用 kill, 示例:# kill -9 1211。kill 也不單單用於停止程式,可用kill [-s <指定訊號>][程式] 傳送指定訊號給指定程式,而# kill -l 可列出全部的訊號名稱。
~~ 列出全部的資訊名稱
# kill -l 
1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
...
...
~~ 傳送 SIGQUIT 給 pid = 1211 的程式
# kill -s SIGQUIT 1211  ~~ 或者 kill -SIGQUIT 1211

5 系統效能引數檢視

ps

  • ps 命令用於顯示當前程式的狀態。命令格式:ps [options]
options 引數解釋
-A/a      列出所有的程式
-e        等於 “-A”
f         顯示程式間的關係
-w        顯示加寬可以顯示較多的資訊
-au       顯示較詳細的資訊
-aux      顯示所有包含其他使用者的行程
  • ps -ef 各項指標解釋
# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  6 18:39 pts/0    00:02:27 java -jar /opt/lp-admin.jar
root        102      0  0 18:40 pts/1    00:00:00 /bin/bash
root        158    102  0 18:47 pts/1    00:00:00 /usr/bin/python /usr/bin/dstat
---------各項指標解析-----------------------
UID    程式的執行者 UID
PID    程式的ID號
PPID   則是其上級父程式的ID
C      cpu 使用的資源百分比
TTY    登入者的終端機位置
TIME   CPU 執行的時間
CMD    程式執行的命令
  • ps -aux 各項指標解釋
# ps -aux
ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  7.0  5.3 13278220 1736948 pts/0 Ssl+ 18:39   2:24 java -jar /opt/lp-admin.jar
root        102  0.0  0.0  15264  2044 pts/1    Ss   18:40   0:00 /bin/bash
root        158  0.0  0.0  52176  6756 pts/1    T    18:47   0:00 /usr/bin/python /usr/bin/dstat
root        159  0.0  0.0  52176  6756 pts/1    T    18:49   0:00 /usr/bin/python /usr/bin/dstat -n -N eth0,total
---------各項指標解析-----------------------
USER    行程擁有者
PID     pid
%CPU    佔用的 CPU 使用率
%MEM    佔用的記憶體使用率
VSZ     佔用的虛擬記憶體大小
RSS     佔用的記憶體大小
TTY     終端的次要裝置號碼 (minor device number of tty)
STAT    該程式程的狀態:
   D:  無法中斷的休眠狀態 (通常 IO 的程式)
   R:  正在執行中
   S:  可中斷的睡眠狀態
   T:  暫停狀態或跟蹤狀態
   Z:  殭屍程式(zombie),無法正常終止
   X: 退出狀態,程式即將被銷燬
START   登入者的終端機位置
TIME    CPU 執行的時間
COMMAND 程式執行的命令

lsof

  • lsof(List Open Files) 用於檢視你程式開打的檔案,開啟檔案的程式,程式開啟的埠(TCP、UDP)。命令格式 lsof [options] filename
options 引數解釋

-a            列出開啟檔案存在的程式
-c<程式名>     列出指定程式所開啟的檔案(常用)
-p<程式號>     列出指定程式號所開啟的檔案(常用)
-g            列出屬於gid的程式詳情
-u<uname/uid> 顯示歸屬uname或uid的程式情況
-d<fd檔案號>   列出佔用該檔案號的程式
+d<目錄>       列出目錄下被開啟的檔案
+D<目錄>       遞迴列出目錄下被開啟的檔案
-n<目錄>       列出使用NFS的檔案
-i<條件>       列出符合條件的程式。(ip4/ip6協議、埠、 @ip )
-u            列出UID號程式詳情
  • lsof 各項指標解釋
# lsof
command  PID USER   FD   type   DEVICE     SIZE     NODE  NAME
init       1 root  txt   REG       8,2    43496  6121706 /sbin/init

---------各項指標解析-----------------------
COMMAND  程式的名稱 
PID      程式識別符號 
USER     程式所有者 
FD       檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等 
TYPE     檔案型別,如DIR、REG等 
DEVICE   指定磁碟的名稱 
SIZE     檔案的大小 
NODE     索引節點(檔案在磁碟上的標識) 
NAME     開啟檔案的確切名稱
  • lsof 示例
~~ 顯示所有開啟80埠的程式
# lsof -i:80       
~~ 那個程式在佔用/etc/passwd
# lsof /etc/passwd 
~~ 顯示使用fd為1211的程式
# lsof -d 1211     
~~ 顯示那些檔案被pid為 1211 的程式開啟
# lsof -p 1211     
~~ 檢視sendmail程式的檔案使用情況
# lsof -c sendmail 

pidof

  • pidof 是linux系統中用來查詢正在執行程式的程式號(pid)的工具。如果我們提前知道程式名,則可以根據程式名查詢pid,命令格式:pidof [options] 程式名稱
options 選項引數

-s: 僅返回一個程式號;
-c: 僅顯示具有相同“root”目錄的程式
-x: 顯示由指令碼開啟的程式
-o: 指定不顯示的程式ID
  • pidof 示例
# pidof -s nginx
1211

top

  • top 命令是用來監控Linux系統狀況,比如cpu、記憶體,程式等資源使用情況。命令格式: top [-options]
options 選項引數

-i<時間>    設定重新整理間隔時間
-u<使用者名稱>    指定使用者名稱
-p<程式號>    指定程式
-H           開啟執行緒檢視
  • top 各項輸出指標解釋
# top
top - 18:20:27 up 26 days,  8:30,  2 users,  load average: 0.04, 0.09, 0.13
Tasks: 168 total,   1 running, 167 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.5 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:  32762356 total, 14675196 used, 18087160 free,      884 buffers
KiB Swap:  2103292 total,        0 used,  2103292 free.  6580028 cached Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                
1260 root      20   0 7933492 1.173g  14004 S 0.333 3.753  58:20.74 java                       
1503 root      20   0   69172   2240   1412 S 0.333 0.007   0:48.05 httpd                       
1520 daemon    20   0  358140   3980    776 S 0.333 0.012   6:19.55 httpd                       
2323 mysql     20   0 19.918g 4.538g   9404 S 0.333 14.52 352:51.44 mysqld                     
.......
---------各項指標解析---------------------------------------------------
第一行統計資訊區
    18:20:27	                    當前時間
    up 25 days, 17:29	            系統執行時間,格式為時:分
    1 user	                    當前登入使用者數
    load average: 0.04, 0.09, 0.13  系統負載,三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值

Tasks:程式相關資訊
    running   正在執行的程式數
    sleeping  睡眠的程式數
    stopped   停止的程式數
    zombie    殭屍程式數
Cpu(s):CPU相關資訊
    %us:表示使用者空間程式的cpu使用率(沒有通過nice排程)
    %sy:表示系統空間的cpu使用率,主要是核心程式
    %ni:表示使用者空間且通過nice排程過的程式的cpu使用率
    %id:空閒cpu
    %wa:cpu執行時在等待io的時間
    %hi:cpu處理硬中斷的數量
    %si:cpu處理軟中斷的數量
    %st:被虛擬機器偷走的cpu
Mem  記憶體資訊  
    total	實體記憶體總量
    used	使用的實體記憶體總量
    free	空閒記憶體總量
    buffers	用作核心快取的記憶體量
Swap 記憶體資訊  
    total	交換區總量
    used	使用的交換區總量
    free	空閒交換區總量
    cached	緩衝的交換區總量

~~ 常用的指標
PID	程式id
PPID	父程式id
UID	程式所有者的使用者id
USER	程式所有者的使用者名稱
GROUP	程式所有者的組名
TTY	啟動程式的終端名。不是從終端啟動的程式則顯示為 ?
PR	優先順序
NI	nice值。負值表示高優先順序,正值表示低優先順序
P	最後使用的CPU,僅在多CPU環境下有意義
%CPU	上次更新到現在的CPU時間佔用百分比
TIME	程式使用的CPU時間總計,單位秒
TIME+	程式使用的CPU時間總計,單位1/100秒
%MEM	程式使用的實體記憶體百分比
VIRT	程式使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
SWAP	程式使用的虛擬記憶體中,被換出的大小,單位kb。
RES	程式使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
CODE	可執行程式碼佔用的實體記憶體大小,單位kb
DATA	可執行程式碼以外的部分(資料段+棧)佔用的實體記憶體大小,單位kb
SHR	共享記憶體大小,單位kb
S       程式狀態; 相關列舉值解釋檢視 ps -ef S 項解釋
COMMAND	程式啟動執行的命令列    
  • top 命令下,檢視資訊常用快捷鍵
h    顯示快捷鍵幫助
k    終止一個程式
i    開/關忽略閒置和僵死程式
q    退出程式
r    重新安排一個程式的優先順序別
S     切換到累計模式
s    更改重新整理間隔時間,單位秒
f,F    從當前顯示中新增或者刪除專案
o,O    改變顯示專案的順序
l    切換顯示平均負載和啟動時間資訊
m     切換顯示記憶體資訊
t    切換顯示程式和CPU狀態資訊
c    切換顯示命令名稱和完整命令列
M     根據記憶體使用大小排序
P    根據CPU使用率進行排序 (預設排序)
T    根據時間/累計時間進行排序
1    展開多核cpu顯示
H       執行緒檢視模式切換為開或關

free

  • free 可檢視系統記憶體的使用情況,包括實體記憶體、交換記憶體(swap)和核心緩衝區記憶體。命令格式:free [-bkmg][-hlot][s delay][-c count]
free 選項引數

 -b,-k,-m,-g  表示輸出顯示的單位為 bytes,KB,MB,or GB,不新增選項的話預設以 KB 為單位顯示
 -h          以人類可讀的方式顯示,即後邊會自動帶上單位
 -l          顯示詳細的低記憶體和高記憶體統計資訊(增加了 Low 和 High 這兩行顯示)
 -o          使用舊的格式顯示(不顯示 -/+buffers/cache 這一行)
 -t          增加顯示 Total 行,Total = Mem + Swap
 -s delay    每 delay 秒重複列印一次,delay 為具體的秒數
 -c count    迴圈列印 count 次後退出,count 為具體的次數。需要配合 -s delay 使用
# free -m
             total       used       free     shared    buffers     cached
Mem:         32107      30414       1692          0       1962       8489
-/+ buffers/cache:      19962      12144
Swap:            0          0          0
------各項指標解釋-------------------------------------------------
Mem 表示實體記憶體統計:
 total   實體記憶體總量,total = used + free
 used    總使用快取的數量(包含 buffers 與 cache),但其中可能部分快取並未實際使用
 free    未被分配的記憶體
 shared  共享記憶體,一般系統不會用到,總是0
 buffers  系統分配但未被使用的 buffers 數量
 cached  系統分配但未被使用的 cache 數量
 
-/+ buffers/cache:
 used    實際使用記憶體,等於第一行的 used - buffers - cached
 free    實際可用記憶體,等於第一行的 free + buffers + cached

Swap表示交換區的使用情況,也就是我們通常所說的虛擬記憶體
 total   總量虛擬記憶體
 used    使用的虛擬記憶體
 free    空閒的虛擬記憶體

mpstat

  • mpstat 是 Multiprocessor Statistics 的縮寫,可以檢視多核心的 cpu 中每個計算核心的統計資料。命令格式:mpstat [-P {cpu|ALL}] [delay [count]]
-P {cpu|ALL}	 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值
delay	         相鄰的兩次取樣的間隔時間
count	         取樣的次數,count只能和delay一起使用
# mpstat  -P ALL 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:19:07 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
07:19:09 PM  all   21.43    3.36    6.54    6.45    0.00    1.29    0.00    0.00    0.00   60.93
07:19:09 PM    0   20.41    3.57    7.14    4.08    0.00    1.53    0.00    0.00    0.00   63.27
07:19:09 PM    1   22.45    3.06    6.12    5.10    0.00    1.53    0.00    0.00    0.00   61.73
---------各項輸出指標解釋----------------------------------------------
CPU	處理器ID	
%usr	在 delay 時間段裡,使用者態的 cpu 時間(%)
%nice	
%sys	在 delay 時間段裡,核心時間(%)	
%iowait	在 delay 時間段裡,硬碟IO等待時間(%)	
%irq	在 delay 時間段裡,硬中斷時間(%)	
%soft	在 delay 時間段裡,軟中斷時間(%)	
%steal	虛擬機器管理器在服務另一個虛擬處理器時虛擬CPU處在非自願等待下花費時間的百分比	
%guest	顯示執行虛擬處理器時 CPU 花費時間的百分比	
%gnice  gnice/total*100
%idle	在internal時間段裡,CPU除去等待磁碟IO操作外的因為任何原因而空閒的時間閒置時間(%)

iostat

  • iostat 主要用於輸出 CPU 和磁碟 I/O 相關的統計資訊,命令格式: iostat [options] [delay [count]]
options 選項引數

-c      只顯示系統CPU統計資訊,即單獨輸出avg-cpu結果,不包括device結果
-d      單獨輸出Device結果,不包括cpu結果
-k/-m   輸出結果以kB/mB為單位,而不是以扇區數為單位
-x      輸出更詳細的io裝置統計資訊
delay   每次輸出間隔時間
count   表示輸出次數,不帶count表示迴圈輸出
  • 預設命令iostat的各項指標解析
# iostat
Linux 4.4.73-5-default        2021年07月08日  _x86_64_        (40 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.50    0.41    0.94    0.02    0.00   96.13

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              12.09        27.80       507.24   57343492 1046298308
sdb              17.95        30.91       647.84   63751096 1336305974
------各項指標解析-----------------------------------------------------------
avg-cpu: 總體cpu使用情況統計資訊,對於多核cpu,這裡為所有cpu的平均值
    %user      使用者空間的CPU使用率
    %nice      CPU處在帶NICE值的使用者模式下的時間百分比
    %system    核心空間的CPU使用率
    %iowait    CPU等待IO的百分比 
    %steal     虛擬機器的虛擬機器CPU使用的CPU
    %idle      空閒的CPU   

Device: 各磁碟裝置的IO統計資訊。各列含義如下:
    tps        每秒程式下發的IO讀、寫請求數量
    KB_read/s  每秒從驅動器讀入的資料量,單位為K。
    KB_wrtn/s  每秒從驅動器寫入的資料量,單位為K。
    KB_read    讀入資料總量,單位為K。
    KB_wrtn    寫入資料總量,單位為K
  • iostat -x -k -d 1 2的各項指標解析
# iostat -x -k -d 1 1
Linux 4.4.73-5-default (ceshi44)        2021年07月08日  _x86_64_        (40 CPU)

Device:  rrqm/s   wrqm/s  r/s    w/s    rkB/s   wkB/s  avgrq-sz avgqu-sz await r_await w_await  svctm  %util
sda      0.08     2.48    0.37   11.71  27.80   507.24  88.53   0.02     1.34   14.96    0.90   0.09   0.10
sdb      0.00     1.20    1.28   16.67  30.91   647.83  75.61   0.17     9.51    9.40    9.52   0.32   0.57
------各項指標解析----------------------------------------------------------
rrqm/s:   每秒對該裝置的讀請求被合併次數,檔案系統會對讀取同塊(block)的請求進行合併
wrqm/s:   每秒對該裝置的寫請求被合併次數
r/s:      每秒完成的讀次數
w/s:      每秒完成的寫次數
rkB/s:    每秒讀資料量(kB為單位)
wkB/s:    每秒寫資料量(kB為單位)
avgrq-sz: 平均每次IO操作的資料量(扇區數為單位)
avgqu-sz: 平均等待處理的IO請求佇列長度
await:    平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
svctm:    平均每次IO請求的處理時間(毫秒為單位)
%util:    採用週期內用於IO操作的時間比率,即IO佇列非空的時間比率

netstat

  • netstat 命令用於顯示各種網路相關資訊,如網路連線,路由表,網路連線狀態。命令格式:netstat [-options]
options 引數解析

-a (all)顯示所有選項,預設不顯示 Listen 相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態

-p 顯示建立相關連結的程式名
-r 顯示路由資訊,路由表
-e 顯示擴充套件資訊,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令
  • 各項輸出指標解析
# netstat -pt 
Proto Recv-Q Send-Q Local Address   Foreign Address  State   PID/Program name  
tcp        0      0 localhost:30037 *:*              LISTEN  2109/firefox
....
------各項指標解析----------------------------------------
Proto           協議
Recv-Q          接收佇列 ,一般都應該是0。如果不是則表示軟體包正在佇列中堆積
Send-Q          傳送佇列,一般都應該是0。如果不是則表示軟體包正在佇列中堆積
Local Address   本地地址+port
Foreign Address 遠端地址+port
State           狀態
PID             程式pid
Program name    程式名
  • netstat 常用命令示例
# netstat -anp
# netstat -tnlp

vmstat

  • vmstat (虛擬記憶體統計)可對作業系統的記憶體、程式、CPU,磁碟進行監控。相比top,可以看到整個機器的CPU、記憶體、IO的使用情況,而不是單單看到各個程式的CPU使用率和記憶體使用率(使用場景不一樣)
  • 命令格式
// -a:顯示活躍和非活躍記憶體 -n:只在開始時顯示一次各欄位名稱
# vmstat [-a] [-n] [delay [count]]
// f:總的fork程式 s:記憶體使用的詳細資訊 d:磁碟的讀/寫 m:系統的slab資訊
# vmstat [-fsdm] 
// 檢視指定磁碟分割槽統計資訊
# vmstat [-p disk partition]
  • vmstat 示例
$ vmstat 2 1
procs --------memory---------   --swap-- --io--- -system-- ----cpu-----
r b   swpd free    buff  cache    si so   bi  bo  in   cs  us sy id wa st
1 0      0 3498472 315836 3819540  0  0    0   1   2    0  3  1  96  0 0

------各項指標解析----------------------------------------
Procs(程式)
  r:     執行佇列中程式數量,當這個值超過了CPU數目,就會出現CPU瓶頸了
  b:    等待IO的程式數量

Memory(記憶體):
  swpd:  使用虛擬記憶體大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了
  free:  可用記憶體大小
  buff:  用作緩衝的記憶體大小
  cache: 用作快取的記憶體大
  
Swap:
  si:    每秒從交換區寫到記憶體的大小,如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程式解決掉
  so:    每秒寫入交換區的記憶體大小

IO:(現在的Linux版本塊的大小為1024bytes)
  bi:    每秒讀取的塊數
  bo:    每秒寫入的塊數,bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整

系統
  in:    每秒中斷數,包括時鐘中斷
  cs:    每秒上下文切換數,呼叫系統函式,就要進行上下文切換,執行緒的切換,也要程式上下文切換,這個值要越小越好

CPU(以百分比表示):
  us:    使用者程式執行時間 
  sy:    系統程式執行時間 
  id:    空閒時間(包括IO等待時間),中央處理器的空閒時間
  wa:    等待 IO 時間  
  st:    虛擬機器的虛擬機器CPU使用的CPU

dstat

  • vmstat 是對系統的整體情況進行統計,無法對某個程式進行深入分析,所以推薦下 dstat。dstat 是一個可以取代vmstat、iostat、netstat 這些命令的多功能命令工具,執行 dstat 命令,預設情況它會收集-cpu-、-disk-、-net-、-paging-、-system-的資料,一秒鐘收集一次。命令格式:dstat [options] [delay [count]],其中使用 -p pid 選項可針對某一程式進行統計監控
options 常用引數解析

-l         顯示負載統計量
-c         開啟cpu統計
-C <CPU>   選項跟著 cpu 的編號,顯示該cpu 的統計
-d         開啟 disk 統計
-g         開啟分頁統計
-y         開啟系統統計,包括中斷和上下文切換
-i         開啟中斷統計
-s 	   開啟 swap 統計,包括used, free
-m         顯示記憶體使用率(包括used,buffer,cache,free值)
-n         開啟網路讀寫統計
–socket    顯示網路統計資料
–tcp       顯示常用的TCP統計
-N	   選項跟著網路裝置名,多個用逗號隔開,進行網路統計
-p         開啟對程式統計,runnable, uninterruptible, new
-r         io開啟請求統計,包括read requests, write requests

--output檔案  此選項也比較有用,可以把狀態資訊以csv的格式重定向到指定的檔案中
-–disk-util   顯示某一時間磁碟的忙碌狀況
-–freespace   顯示當前磁碟空間使用率
-–proc-count  顯示正在執行的程式數量
--top-bio-adv 指出塊I/O最大的程式
--top-cputime 耗費CPU時間最多的程式名和耗費時間
--top-cpu-adv 顯示CPU佔用最大的程式
-–top-io      顯示正常I/O最大的程式
-–top-mem     顯示佔用最多記憶體的程式
  • 輸出指標解析
# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
 29   7  57   6   0   1|  85k 1457k|   0     0 |   0     0 |8350    67k
 30   9  54   6   0   1|   0  1290k| 857B  568B|   0     0 |  33k   75k
...

------各項指標解析-----------------------------------
CPU的使用率
  usr   顯示了使用者佔比
  sys   系統佔比
  idl   空閒佔比
  wai   等待佔比
  hiq   硬中斷
  siq   軟中斷情況

磁碟的讀寫
  read  磁碟的讀總數
  writ  磁碟的寫總數
 
網路裝置傳送和接受的資料
  recv  網路收資料總數
  send  網路發資料總數

系統的分頁活動
  in    記憶體頁換入
  out   記憶體頁換出
  
系統統計	 
  int   統計中斷
  csw   上下文切換
  • 指定展示各個網路卡的收發狀態
# dstat -n -N eth0,total
--net/eth0---net/total-
 recv  send: recv  send
   0     0 :   0     0 
 140B  140B: 140B  140B
  18k 6570B:  18k 6570B
  • 檢視全部記憶體都有誰在佔用
# dstat -g -l -m -s --top-mem
---paging-- ---load-avg--- ------memory-usage----- ----swap--- --most-expensive-
  in   out | 1m   5m  15m | used  buff  cach  free| used  free|  memory process 
   0     0 |5.44 4.77 5.09|23.2G 2108k 7892M  233M|   0     0 |java        1670M
   0     0 |5.44 4.77 5.09|23.3G 2108k 7893M  221M|   0     0 |java        1670
  • 程式最耗資源統計
# dstat --top-cpu-adv 1 2
-------most-expensive-cpu-process-------
process              pid  cpu read write
java                   1  0.0%  43B   0                
java                   1  0.2%   0    0

sar

  • sar 和 dstat 差不多,隨你們各自喜好使用,可以從多方面對系統的資源進行監控,包括:檔案的讀寫情況、系統呼叫的使用情況、磁碟I/O、CPU效率、記憶體使用狀況、程式活動及 IPC 有關的活動等。命令格式:sar [options] [-A] [-o file] delay [count]。delay 為取樣間隔,count 為取樣次數,預設值是1
options 選項引數

-A          所有報告的總和
-o file     表示將命令結果以二進位制格式存放在檔案中,file 是檔名
-u          輸出CPU使用情況的統計資訊
-v          輸出inode、檔案和其他核心表的統計資訊
-d          輸出每一個塊裝置的活動資訊
-b          顯示I/O和傳送速率的統計資訊(相對-d 是彙總資訊)
-r          輸出記憶體和交換空間的統計資訊
-R          輸出記憶體頁面的統計資訊
-a          檔案讀寫情況
-q          佇列長度和平均負載
-c          輸出程式統計資訊,每秒建立的程式數
-y          終端裝置活動情況
-w          輸出系統交換活動資訊
-x <pid>    顯示給定程式的統計資訊
-n <關鍵詞>  統計網路資訊
    關鍵詞可以是:
        DEV    網路卡
        EDEV   網路卡 (錯誤)
        NFS    NFS 客戶端
        NFSD   NFS 伺服器
        SOCK   Sockets (套接字)    (v4)
        SOCK6  Sockets (套接字)    (v6)
        IP     IP 流    (v4)
        EIP    IP 流    (v4) (失敗資訊)
        ICMP   ICMP 流  (v4)
        EICMP  ICMP 流  (v4) (失敗資訊)
        TCP    TCP 流   (v4)
        ETCP   TCP 流   (v4) (失敗資訊)
        UDP    UDP 流   (v4)
        IP6    IP 流    (v6)
        EIP6   IP 流    (v6) (失敗資訊)
        ICMP6  ICMP 流  (v6)
        EICMP6 ICMP 流  (v6) (失敗資訊)
        UDP6   UDP 流   (v6)
  • 檢視 CPU 使用情況:sar -u 1 2
# sar -u  1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:02:04 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
07:02:05 PM     all     23.90      3.22      7.97      5.25      0.00     59.66
07:02:06 PM     all     26.53      4.76      8.84      5.95      0.00     53.91
Average:        all     25.21      3.99      8.40      5.60      0.00     56.79
------各項指標解析---------------------------------
%user     使用者空間的CPU使用
%nice     改變過優先順序的程式的CPU使用率
%system   核心空間的CPU使用率
%iowait   CPU等待IO的百分比 
%steal    虛擬機器的虛擬機器CPU使用的CPU
%idle     空閒的CPU
  • 檢視記憶體使用情況 sar -r
# sar -r 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:05:16 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
07:05:17 PM    299596  32398396     99.08      2084   7615088  37900868    115.91  27267692   3809860       672
07:05:18 PM    298932  32399060     99.09      2084   7615848  37900100    115.91  27267828   3810252       488
Average:       299264  32398728     99.08      2084   7615468  37900484    115.91  27267760   3810056       580

------各項指標解析--------------------
kbmemfree   空閒的實體記憶體大小
kbmemused   使用中的實體記憶體大小
%memused    實體記憶體使用率
kbbuffers   核心中作為緩衝區使用的實體記憶體大小,kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache. 
kbcached    快取的檔案大小
kbcommit    保證當前系統正常執行所需要的最小記憶體,即為了確保記憶體不溢位而需要的最少記憶體(實體記憶體+Swap分割槽)
commit      這個值是kbcommit與記憶體總量(實體記憶體+swap分割槽)的一個百分比的值
  • 檢視 IO 和傳遞速率:sar -b
# sar -b 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:06:08 PM       tps      rtps      wtps   bread/s   bwrtn/s
07:06:09 PM    171.00      0.00    171.00      0.00   3431.00
07:06:10 PM    163.00      0.00    163.00      0.00   2620.00
Average:       167.00      0.00    167.00      0.00   3025.50
------各項指標解析--------------------
tps      磁碟每秒鐘的IO總數,等於iostat中的tps
rtps     每秒鐘從磁碟讀取的IO總數
wtps     每秒鐘從寫入到磁碟的IO總數
bread/s  每秒鐘從磁碟讀取的塊總數
bwrtn/s  每秒鐘此寫入到磁碟的塊總數
  • 網路介面資訊:sar -n DEV
# sar -n DEV 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:06:57 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
07:06:58 PM      eth0      2.00      4.00      1.45      0.56      0.00      0.00      0.00
07:06:58 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:06:58 PM     tunl0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:         eth0      2.00      4.00      1.45      0.56      0.00      0.00      0.00
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:        tunl0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
------各項指標解析--------------------
IFACE    本地網路卡介面的名稱
rxpck/s  每秒鐘接受的資料包
txpck/s  每秒鐘傳送的資料庫
rxKB/S   每秒鐘接受的資料包大小,單位為KB
txKB/S   每秒鐘傳送的資料包大小,單位為KB
rxcmp/s  每秒鐘接受的壓縮資料包
txcmp/s  每秒鐘傳送的壓縮包
rxmcst/s 每秒鐘接收的多播資料包  
  • 檢視磁碟使用情況:sar -d。相對 -b 它可以看到各個裝置的資訊,-b 輸出的是彙總資訊
sar -d -p 1 1  
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:08:41 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
07:08:42 PM       sdb    160.00      0.00   2914.00     18.21      1.51      9.43      3.73     59.70
07:08:42 PM       sdc      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
07:08:42 PM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:          sdb    160.00      0.00   2914.00     18.21      1.51      9.43      3.73     59.70
Average:          sdc      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:          sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
------各項指標解析--------------------
DEV       磁碟裝置的名稱,如果不加-p,會顯示dev253-0類似的裝置名稱,因此加上-p顯示的名稱更直接
tps       每秒I/O的傳輸總數
rd_sec/s  每秒讀取的扇區的總數
wr_sec/s  每秒寫入的扇區的總數
avgrq-sz  平均每次次磁碟I/O操作的資料大小(扇區)
avgqu-sz  磁碟請求佇列的平均長度
await     從請求磁碟操作到系統呼叫完成處理,每次請求的平均消耗時間
svctm     I/O的服務處理時間,即不包括請求佇列中的時間
%util     I/O請求佔用的CPU百分比,值越高,說明I/O越慢
  • 統計socket連線資訊:sar -n SOCK 1 1
# sar -n SOCK 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:09:18 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
07:09:19 PM     10910       261         0         0         0       562
Average:        10910       261         0         0         0       562
------各項指標解析--------------------
totsck   當前被使用的socket總數
tcpsck   當前正在被使用的TCP的socket總數
udpsck   當前正在被使用的UDP的socket總數
rawsck   當前正在被使用於RAW的skcket總數
if-frag  當前的IP分片的數目
tcp-tw   TCP套接字中處於TIME-WAIT狀態的連線數量
  • TCP連線的統計:sar -n TCP
# sar -n TCP 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

07:09:39 PM  active/s passive/s    iseg/s    oseg/s
07:09:40 PM      1.00      0.00      5.00      7.00
Average:         1.00      0.00      5.00      7.00
------各項指標解析--------------------
active/s   新的主動連線
passive/s  新的被動連線
iseg/s     接受的段
oseg/s     輸出的段

pidstat

  • pidstat是sysstat工具的一個命令,用於監控全部或指定程式的cpu、記憶體、執行緒、裝置IO等系統資源的佔用情況。命令格式:pidstat [options] [delay [count]]
options 引數解析

-u         預設的引數,顯示各個程式的cpu使用統計
-r         顯示各個程式的記憶體使用統計
-d         顯示各個程式的IO使用情況
-p <pid>   指定程式號
-w         顯示每個程式的上下文切換情況
-t         顯示選擇程式的執行緒的統計資訊
  • 檢視所有程式的 CPU 使用情況:pidstat -u
# pidstat -u
Linux 4.4.73-5-default (ceshi44)        2021年07月08日  _x86_64_        (40 CPU)

14時11分56秒   UID  PID  %usr %system  %guest    %CPU   CPU  Command
14時11分56秒     0    1  0.15    0.06    0.00    0.22    22  systemd
....
------各項指標解析----------------------------------------
UID      程式所屬UID
PID      程式ID
%usr     程式在使用者空間佔用cpu的百分比
%system  程式在核心空間佔用cpu的百分比
%guest   程式在虛擬機器佔用cpu的百分比
%CPU     程式佔用cpu的百分比
CPU      處理程式的cpu編號
Command  當前程式對應的命令
  • 記憶體使用情況統計:pidstat -r
# pidstat -r
Linux 4.4.73-5-default (ceshi44)        2021年07月08日  _x86_64_        (40 CPU)

14時13分08秒   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
14時13分08秒     0         1     41.04      0.00  186020   5968   0.00  systemd
14時13分08秒     0       443      0.00      0.00    5828   3004   0.00  pidstat
....
------各項指標解析----------------------------------------
PID       程式識別符號
Minflt/s  任務每秒發生的次要錯誤,不需要從磁碟中載入頁
Majflt/s  任務每秒發生的主要錯誤,需要從磁碟中載入頁
VSZ       虛擬地址大小,虛擬記憶體的使用KB
RSS       常駐集合大小,非交換區五里記憶體使用KB
Command   task命令名
  • 顯示各個程式的IO使用情況:pidstat -d
# pidstat -d
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

06:42:35 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
06:42:35 PM     0         1      0.05      0.00      0.00  java
06:42:35 PM     0       102      0.04      0.05      0.00  bash
------各項指標解析---------------------------
kB_rd/s   每秒從磁碟讀取的KB
kB_wr/s   每秒寫入磁碟KB
kB_ccwr/s 任務取消的寫入磁碟的KB。當任務截斷髒的pagecache的時候會發生
Command   程式執行命令
  • 顯示每個程式的上下文切換情況:pidstat -w
# pidstat -w
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

06:43:23 PM   UID       PID   cswch/s nvcswch/s  Command
06:43:23 PM     0         1      0.00      0.00  java
06:43:23 PM     0       102      0.00      0.00  bash
06:43:23 PM     0       150      0.00      0.00  pidstat
------各項指標解析---------------------------
PID       程式id
Cswch/s   每秒主動任務上下文切換數量
Nvcswch/s 每秒被動任務上下文切換數量
Command   程式執行命令
  • 指定程式並( -t)顯示程式的執行緒統計資訊:pidstat -t -p 1211
# pidstat -t -p 1211
06:44:37 PM   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
06:44:37 PM     0         1         -    0.00    0.00    0.00    0.00     3  java
06:44:37 PM     0         -         1    0.00    0.00    0.00    0.00     3  |__java
06:44:37 PM     0         -         6    0.00    0.00    0.00    0.00     5  |__java
06:44:37 PM     0         -         7    0.00    0.00    0.00    0.00     4  |__java
...
------各項指標解析---------------------------
TGID      主執行緒的表示
TID       執行緒id
%usr      程式在使用者空間佔用cpu的百分比
%system   程式在核心空間佔用cpu的百分比
%guest    程式在虛擬機器佔用cpu的百分比
%CPU      程式佔用cpu的百分比
CPU       處理程式的cpu編號
Command   當前程式對應的命令

pstree

  • ps 命令可以顯示當前正在執行的那些程式的資訊,但是對於它們之間的關係卻顯示得不夠清晰,pstree 命令可以以樹狀圖顯示程式間的關係。命令格式:pstree [-p] <pid>
# pstree -p 3169
mongod(3169)─┬─{mongod}(3170)
             ├─{mongod}(3173)
             ├─{mongod}(3174)
             ├─{mongod}(3175)
             ├─{mongod}(3177)
             ├─{mongod}(3178)
             ├─{mongod}(3179)
             ├─{mongod}(3180)

strace

  • strace 可以跟蹤到一個程式產生的系統呼叫,包括引數,返回值,執行消耗的時間命令格式:strace [options] [command]。如果指定程式pid,要去掉 command
options 簡單常用的引數解析

-c                統計每一系統呼叫的所執行的時間,次數和出錯的次數等
-t                在輸出中的每一行前加上時間資訊
-tt               在輸出中的每一行前加上時間資訊,微秒級
-ttt              微秒級輸出,以秒了表示時間
-T                顯示每一呼叫所耗的時間
-e trace=         只跟蹤指定的系統 呼叫.例如:-e trace=open,close,rean,write表示只跟蹤這四個系統呼叫,預設是 all
-e trace=file     只跟蹤有關檔案操作的系統呼叫
-e trace=process  只跟蹤有關程式控制的系統呼叫
-e trace=network  跟蹤與網路有關的所有系統呼叫
-e trace=ipc      跟蹤所有與程式通訊有關的系統呼叫
-o filename       將strace的輸出寫入檔案filename 
-p pid            跟蹤指定的程式pid
  • strace 示例
# strace ls
# strace cat /dev/null
# strace -o output.txt -T -tt -e trace=all -p 28979
  • 每一行都是一條系統呼叫,等號左邊是系統呼叫的函式名及其引數,右邊是該呼叫的返回值

pmap

  • pmap 提供了程式的記憶體對映,pmap命令用於顯示一個或多個程式的記憶體狀態。其報告程式的地址空間和記憶體狀態資訊
  • pmap [options] PID
options 引數解析
-x extended顯示擴充套件格式
-d device顯示裝置格式
# pmap -dx 1
Address  Kbytes Mode  Offset           Device    Mapping
00110000 1480K  r-x-  0000000000000000 008:00005 /usr/lib/libcrypto.so.1.0.0
00282000 80K    rw--  0000000000015000 008:00005 /usr/lib/libcrypto.so.1.0.0
00296000 12K    rw--  0000000000015000 008:00005 [ anon ]
.....
------各項指標解析----------------------------------------
Address: 記憶體開始地址
Kbytes:  佔用記憶體的位元組數(KB)
RSS:     保留記憶體的位元組數(KB)
Dirty:   髒頁的位元組數(包括共享和私有的)(KB)
Mode:    記憶體的許可權:read、write、execute、shared、private (寫時複製)
Mapping: 佔用記憶體的檔案、或[anon](分配的記憶體)、或[stack](堆疊)
Offset:  檔案偏移
Device:  裝置名 (major:minor)

watch

  • watch 可以幫助實現定時輸出的命令結果,比如 netstat 沒有間隔輸出結果的功能。watch [-options] <command>
options 常用引數選項

-n <num> watch 預設每2秒執行一下程式,可以用 -n 來指定間隔的時間  
-d       watch 會高亮顯示變化的區域

切換終端: Ctrl+x     退出watch:Ctrl+g
  • watch 示例
# watch -n 1 -d netstat -ant
# watch uptime

6 網路資料抓取

tcpdump

  • tcpdump 是一個執行在命令列下的抓包工具。它允許使用者攔截和顯示傳送或收到過網路連線到該計算機的TCP/IP和其他資料包。tcpdump 適用於大多數的類Unix系統作業系統;tcpdump 命令格式為:
# tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 檔名 ]
        [ -i 網路介面 ] [ -r 檔名] [ -s len ]
        [ -T 型別 ] [ -w 檔名 ] [ 表示式 ]
選項引數

-a       將網路地址和廣播地址轉變成名字
-d     將匹配資訊包的程式碼以人們能夠理解的彙編格式給出
-dd     將匹配資訊包的程式碼以c語言程式段的格式給出
-ddd    將匹配資訊包的程式碼以十進位制的形式給出
-e    在輸出行列印出資料鏈路層的頭部資訊,包括源mac和目的mac,以及網路層的協議
-f    將外部的Internet地址以數字的形式列印出來
-l    使標準輸出變為緩衝行形式
-n    指定將每個監聽到資料包中的域名轉換成IP地址後顯示,不把網路地址轉換成名字
-nn:    指定將每個監聽到的資料包中的域名轉換成IP、埠從應用名稱轉換成埠號後顯示
-t    在輸出的每一行不列印時間戳
-v    輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務型別的資訊
-vv    輸出詳細的報文資訊
-c    在收到指定的包的數目後,tcpdump就會停止
-F    從指定的檔案中讀取表示式,忽略其它的表示式
-i    指定監聽的網路介面
-p:     將網路卡設定為非混雜模式,不能與host或broadcast一起使用
-r    從指定的檔案中讀取包(這些包一般通過-w選項產生)
-w    直接將包寫入檔案中,並不分析和列印出來
-s len  len 表示從一個包中擷取的位元組數。0表示包不截斷,抓完整的資料包。預設的話 tcpdump 只顯示部分資料包,預設68位元組
-T     將監聽到的包直接解釋為指定的型別的報文,常見的型別有rpc (遠端過程呼叫)和snmp(簡單網路管理協議)
-X       告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進位制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。    
  • 表示式選項 大體可以分成三種過濾條件,“型別”、“方向”和“協議”,這三種條件的搭配組合就構成了我們的過濾表示式
    • 型別關鍵字:主要包括host,net,port, 例如 host 210.45.114.211,指定主機 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一個網路地址,port 21 指明埠號是21
    • 傳輸方向的關鍵字:主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的網路地址是210.11.0.0
    • 協議的關鍵字:主要包括 ether,ip,ip6,arp,rarp,tcp,udp等型別,及這幾個的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的(更具體的請自行檢視官方文件)

image.png

第一行:“tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode”;

提示使用選項 -v 和 -vv,可以看到更全的輸出內容


第二行“listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes”;

我們監聽的是通過 eth0 這個NIC裝置的網路包,且它的鏈路層是基於乙太網的,要抓的包大小限制是65535位元組。包大小限制值可以通過-s選項來設定


第三行”12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),”

12:40:33.569037 分別對應著這個包被抓到的“時”、“分”、“秒”、“微妙”。 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址 00:19:e0:b5:10:94 傳送到MAC地址為 00:1a:a0:31:39:d4 的主機,ethertype IPv4 (0x0800)表示Ethernet幀的協議型別為ipv4(即程式碼為0x0800)


第四行”length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808;

length 66表示以太幀長度為66。 210.45.123.249.27236 表示這個包的源IP為210.45.123.249,源埠為27236,’>’表示資料包的傳輸方向, 172.16.0.11.1111, 表示這個資料包的目的端ip為172.16.0.11,目標埠為1111,1111埠是我的一個web伺服器監聽埠。Flags是[S],表明是syn建立連線包(即三次握手的第一次握手),seq1624463808 序號為1624463808,這個其實就是TCP三次握手的第一次握手:client(210.45.123.249)傳送syn請求建立連線包


第五行” win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0”

win 8192 表示視窗大小為8192位元組。options[mss 1460,nop,wscale 2,nop,nop,sackOK]為tcp首部可選欄位mss 1460表示mss是傳送端(客戶端)通告的最大報文段長度,傳送端將不接收超過這個長度的TCP報文段(這個值和MTU有一定關係)。nop是一個空操作選項, wscale指出傳送端使用的視窗擴大因子為2, sackOK 表示傳送端支援並同意使用SACK選

  • tcpdump 示例
~~ 只查目標機器埠是21或80的網路包,其他埠不關注
# tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
~~ 想獲取172.16.10.11 和 google.com之間建立TCP三次握手中帶有SYN標記位的網路包.
# tcpdump -i eth0 'host 172.16.0.11 and host google.com and tcp[13]&2!=0' -c 3 -nn
  • 最後一命令的 tcp[13]&2!=0 可能有點怪,這裡解析一下,標誌位(URG,ACK,PSH,RST,SYN,FIN)在 tcp頭部的第 13 個位元組中,而 SYN 則在低第二位(xxxxxx10,十進位制是2),和2進行與操作,即可判斷報文是否 syn 報文

nc

  • nc 命令實現任意TCP/UDP埠的偵聽,nc可以作為 server 以TCP或UDP方式偵聽指定埠。nc 也可以作為 client 發起TCP或UDP連線
options 常用引數
-l    用於指定nc將處於偵聽模式。指定該引數,則意味著nc被當作server,偵聽並接受連線,而非向其它地址發起連線。
-s    指定傳送資料的源IP地址,適用於多網路卡機
-u    指定nc使用UDP協議,預設為TCP
-v    輸出互動或出錯資訊,新手除錯時尤為有用
-w    超時秒數,後面跟數字
-z    使用 Zero-I/O mode,只在掃描通訊埠時使用
  • nc 示例
~~ 埠掃描
# nc -v -w 2 192.168.2.34 -z 21-24
nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused
Connection to 192.168.2.34 22 port [tcp/ssh] succeeded!

~~ 簡單聊天工具 在 192.168.2.34 服務端監聽 1211
# nc -l 1211
~~ 在 192.168.2.33 上 連線 34 的 1211埠
# nc 192.168.2.34 1211

curl

  • curl 是一款很強大的 http 命令列工具。它支援檔案的上傳和下載。命令格式:curl [option] [url]
option 常用引數

-A/--user-agent <string>   設定使用者代理髮送給伺服器
-b <name=string/file>      cookie字串或檔案讀取位置
-c <file>                  操作結束後把cookie寫入到這個檔案中
-C <offset>                斷點續轉
-D <file>                  把header資訊寫入到該檔案中
-e                         來源網址(偽造referer)
-o                         把輸出寫到該檔案中
-O                         把輸出寫到該檔案中,保留遠端檔案的檔名
-r <range>                 分塊下載來自HTTP/1.1或FTP伺服器 range位元組
-T <file>                  上傳檔案
-u <user[:password]>       設定伺服器的使用者和密碼
-L                         引數會讓 HTTP 請求跟隨伺服器的重定向。curl 預設不重定向
-x <host:port>             在給定的埠上使用HTTP代理
-#                         進度條顯示當前的傳送狀態
-X                         指定 HTTP 請求的方法
-d                         POST方式傳送資料(預設是application/x-www-form-urlencoded)
-H/--header <line>         自定義頭資訊傳遞給伺服器
  • curl 示例
~~ 顯示下載進度條
# curl -# -O http://www.linux.com/lwl.jpg
~~ 上傳檔案
# curl -T lwl.jpg -u 使用者名稱:密碼 ftp://www.linux.com/img/
~~ 發出 POST 請求
# curl -X POST https://www.example.com
~~ data.json 是json 資料
# curl localhost:3000/api/json -X POST -d @data.json --header "Content-Type: application/json"

wget

  • wget 是一個下載檔案的工具,對於Linux使用者是必不可少的工具,因為我們經常要下載一些軟體或從遠端伺服器恢復備份到本地伺服器。wget支援HTTP,HTTPS和FTP協議。命令格式:wget [-options] [url]
options 常用引數解析

-O <fileName>        把文件寫到FILE檔案中
-c                   (斷點續傳)接著下載沒下載完的檔案
-P filePath          將檔案儲存到 filePath 目錄 
-b                   後臺下載

TP 選項:
--ftp-user=USER         設定 ftp 使用者名稱為 USER
--ftp-password=PASS     設定 ftp 密碼為 PASS
  • wget 示例
~~ wget -b 後臺下載
# wget -c -b -O wordpress.zip https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
~~ ftp 下載 csc.txt 檔案
# wget --ftp-user=baidu  --ftp-password=123 ftp://192.168.19.1/lwl/csc.txt

7 shell 指令碼命令

shell 程式語法

sed

  • 如果涉及到文字處理,可試試 sed,sed 採用的是流編輯模式,在 sed 處理資料之前,需要預先提供一組規則,sed 會按照此規則來編輯資料
  • 之前寫的一篇文章:sed教程-linux命令

awk

  • awk 同樣適合處理文字,且更強大; 和 sed 命令類似,awk 命令也是逐行掃描檔案,尋找含有目標文字的行,如果匹配成功,則會在該行上執行使用者想要的操作;反之,則不對行做任何處理
  • 之前寫的一篇文章:awk教程-linux命令

xargs

  • xargs 是一個強有力的命令,在 linux 命令管道傳遞中,它能夠捕獲上一個命令的輸出,然後傳遞給另外一個命令。xargs 預設的命令是 echo,這意味著通過管道傳遞給 xargs 的輸入將會包含換行和空白,不過通過 xargs 的處理,換行和空白將被空格取代
  • 命令格式:command |xargs [-options] nextCommand
options 引數解釋

-e flag 或 -E flag    flag必須是一個以空格分隔的標誌,當xargs分析到含有flag這個標誌的時候就停止
-r no-run-if-empty    當xargs的輸入為空的時候則停止xargs,不再去執行
-t                    表示先列印命令,然後再執行
-p                    每執行一次xargs 後面跟隨的 nextCommand 時,詢問一次使用者
-n num                將輸出資料用"空格"分割成多個引數,再按n個一組分批作為 nextCommand 執行時的引數
-L num 或 -l num      從標準輸入一次讀取 num 行送給 nextCommand 命令執行
-i 或 -I              將一行一行賦值給佔位符 {},在接下來的command裡用 {} 替換資料
-s num                命令列的最大字元數,指的是 xargs 後面那個命令的最大命令列字元數
-d delim              指定分隔符,預設的xargs分隔符是回車(換行鍵),這裡修改的是xargs的分隔符
  • xargs 示例
~~ 複製所有圖片檔案到 /data/images 目錄下
# ls *.jpg | xargs -n1 -I {} cp {} /data/images
~~ 查詢所有的 jpg 檔案,並且壓縮它們
# find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

8 jvm 常用命令

jps

  • java 版的 ps 命令,檢視java程式及其相關的資訊,如果想找到一個 java 程式的 pid,那可以用 jps 命令替代linux中的 ps 命令了,命令格式: jps [-options] [hostIP]。如果要檢視其他 hostIP 機器上的jvm程式,需要在待檢視機器上啟動 jstatd
options 引數解釋

-l : 輸出主類全名或jar路徑
-q : 只輸出LVMID
-m : 輸出JVM啟動時傳遞給main()的引數
-v : 輸出JVM啟動時顯示指定的JVM引數
  • jps 示例
# jps -lmv
18884 /opt/app/spring-boot/order.jar --spring.profiles.active=test
39812 /opt/app/spring-boot/user.jar --spring.profiles.active=test

jinfo

  • jinfo 是用來檢視JVM引數和動態修改部分JVM引數的命令;命令格式:jinfo [-option] <pid>
options 引數解釋

-flag <name>          列印指定名稱的引數
-flag [+|-]<name>     開啟或關閉引數
-flag <name>=<value>  設定引數
-flags                列印所有引數
-sysprops             列印系統配置
預設是 flags 和 sysprops
  • jinfo 示例
# jinfo -flags 19092
Attaching to process ID 19092, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:+ManagementServer -XX:Max
HeapSize=4229955584 -XX:MaxNewSize=1409810432 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassP ointers -XX:+UseCompressedOops 
.....

jstat

  • jstat 命令是使用頻率比較高的命令,主要用來檢視JVM執行時的狀態資訊,包括記憶體狀態、垃圾回收等;命令格式:jstat [-option] pid [interval] [count],pid 是程式id,interval 是列印間隔時間(毫秒),count是列印次數(預設一直列印)
option 引數解釋

-class            : class loader的行為統計
-compiler         : HotSpt JIT編譯器行為統計
-gc               : 垃圾回收堆的行為統計
-gccapacity       : 各個垃圾回收代容量(young,old,perm)和他們相應的空間統計
-gcutil           : 垃圾回收統計概述
-gccause          : 垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的原因
-gcnew            : 新生代行為統計
-gcnewcapacity    : 新生代與其相應的記憶體空間的統計
-gcold            : 年老代和永生代行為統計
-gcoldcapacity    : 年老代行為統計
-gcpermcapacity   : 永生代行為統計
-printcompilation : HotSpot編譯方法統計
  • jstat 示例
# jstat -gcutil 18884
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
0.00  84.14  19.93  45.77  91.32  87.65    641   18.311     6    3.512   21.824

------各項指標解析----------------------------------------
S0	第 0 個 survivor(倖存區)使用的百分比
S1	第 1 個 survivor(倖存區)使用的百分比
E	Eden 區使用記憶體的百分比
O	老生代記憶體使用的百分比
P/M	PermGen/MetaSpace 的記憶體使用百分比
YGC	程式啟動以來 Young GC 發生的次數
YGCT	程式啟動以來 Young GC 共消耗的時間(s)
FGC	程式啟動以來 Full GC 發生的次數
FGCT	程式啟動以來 Full GC 共消耗的時間(s)
GCT	程式啟動以來 GC 的總用時(s)

jstack

  • jstack 是用來檢視 jvm 執行緒快照的命令,執行緒快照是當前JVM執行緒正在執行的方法堆疊集合。使用 jstack 命令可以定位執行緒出現長時間卡頓的原因,例如死鎖,死迴圈等。jstack 還可以檢視程式崩潰時生成的 core 檔案中的 stack 資訊;命令格式:jstack [-Flm] <pid>
option 引數解釋

-F  當使用jstack <pid>無響應時,強制輸出執行緒堆疊
-m  同時輸出java和本地堆疊(混合模式)
-l  額外顯示鎖資訊 (小寫l)
  • jstack 示例,檢視 pid = 1211 的執行緒棧
# jstack -l 1211
"DiscoveryClient-CacheRefreshExecutor-0" #146 daemon prio=5 os_prio=0 tid=0x000000002ba2c000 nid
=0x4fe4 waiting on condition [0x000000002cade000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c775dc60> (a java.util.concurrent.SynchronousQueue$Tra
nsferStack)
......

jmap

  • jmap 是用來生成堆dump檔案 或 檢視堆相關的各類資訊的命令,例如檢視 finalize 執行佇列,heap 的詳細資訊和使用情況;命令格式:jmap [-option] <pid>
option 引數解釋

-heap 列印java heap摘要
-histo[:live] 列印堆中的java物件統計資訊
-clstats 列印類載入器統計資訊
-finalizerinfo 列印在f-queue中等待執行finalizer方法的物件
-dump:<dump-options> 生成java堆的dump檔案
      dump-options:
      live 只轉儲存活的物件,如果沒有指定則轉儲所有物件
      format=b 二進位制格式
      file=<file> 轉儲檔案到 <file>
-F 如果jvm掛起,可用-F強制執行選項,會影響java 服務
  • jmap 示例,dump 出 pid=1211 java程式的記憶體堆檔案
# jmap -dump:live,format=b,file=dump.hprof 1211
Dumping heap to /home/lwl/dump.hprof ...
Heap dump file created

歡迎指正文中錯誤

參考文章

相關文章