Linux就業技術指導(五):Linux運維核心管理命令詳解

一,Linux核心進程管理命令

1.1 ps:查看進程

1.1.1 命令解釋

功能說明css

ps命令用於列出執行ps命令的那個時刻的進程快照,就像用手機給進程照了一張照片。若是想要動態地顯示進程,就須要使用top命令,該命令相似於把手機切換成錄像模式。html

選項說明linux

參數選項 解釋說明(帶@的爲重點)
-a 顯示全部終端下執行的進程
a 顯示與終端相關的全部進程,包含每一個進程的完整路徑@
x 顯示與終端無關的全部進程@
u 顯示進程的用戶信息@
-u 顯示指定用戶相關的進程信息
-e 顯示全部進程@
-f 額外顯示UID,PPID,C與STIME欄位@
f 顯示進程樹
-H 顯示進程樹
-l 以詳細的格式來顯示進程的情況
-o 自定義輸出指定的字段,以逗號分隔
-sort key key表示爲指定字段排序,默認升序,+key升序,-key降序

1.1.2 使用範例

(1)ps 命令不接任何參數ios

[root@Mr_chen ~]# ps
   PID TTY          TIME CMD
  1135 pts/0    00:00:00 bash
  1152 pts/0    00:00:00 bash
  1162 pts/0    00:00:00 bash
  1173 pts/0    00:00:00 bash
  1182 pts/0    00:00:00 ps

默認狀況下,ps命令不接任何參數時,輸出的是使用者當前所在終端(窗口)的進程,其輸出結果中的各項說明以下。nginx

  • [x] :PID是進程的標識號
  • [x] :TTY是進程所屬的終端控制檯
  • [x] :TIME列是進程所使用的總的CPU時間
  • [x] :CMD列是正在執行的命令行

(2)ps -ef正則表達式

[root@Mr_chen ~]# ps -ef    # -e顯示全部進程,-f格外顯示UIDPPIDCSTIME欄位
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 15:00 ?        00:00:00 /sbin/init
root          2      0  0 15:00 ?        00:00:00 [kthreadd]
root          3      2  0 15:00 ?        00:00:00 [migration/0]
root          4      2  0 15:00 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 15:00 ?        00:00:00 [migration/0]
root          6      2  0 15:00 ?        00:00:00 [watchdog/0]
root          7      2  0 15:00 ?        00:00:00 [events/0]
root          8      2  0 15:00 ?        00:00:00 [cgroup]
root          9      2  0 15:00 ?        00:00:00 [khelper]
root         10      2  0 15:00 ?        00:00:00 [netns]
root         11      2  0 15:00 ?        00:00:00 [async/mgr]
root         12      2  0 15:00 ?        00:00:00 [pm]
root         13      2  0 15:00 ?        00:00:00 [sync_supers]
root         14      2  0 15:00 ?        00:00:00 [bdi-default]
root         15      2  0 15:00 ?        00:00:00 [kintegrityd/0]
root         16      2  0 15:00 ?        00:00:00 [kblockd/0]
root         17      2  0 15:00 ?        00:00:00 [kacpid]

輸出信息中各列說明以下docker

  • [x] UID:進程被該UID所擁有
  • [x] PID:進程的標識號
  • [x] PPID:進程的父進程的標識號
  • [x] C:CPU使用的資源百分比
  • [x] STIME:進程開始的時間
  • [x] TTY:該進程是在哪一個終端機上面運做,若與終端機無關,則顯示「?」,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡鏈接進主機的進程。
  • [x] TIME:進程所使用的總的CPU時間
  • [x] CMD:正在執行的命令行

(3)ps aux編程

[root@Mr_chen ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19232  1488 ?        Ss   15:00   0:00 /sbin/init
root          2  0.0  0.0      0     0 ?        S    15:00   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    15:00   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    15:00   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    15:00   0:00 [migration/0]
root          6  0.0  0.0      0     0 ?        S    15:00   0:00 [watchdog/0]
root          7  0.0  0.0      0     0 ?        S    15:00   0:00 [events/0]

輸出信息中各列的說明以下ubuntu

  • [x] USER:該進程屬於的用戶。
  • [x] PID:該進程的進程號。
  • [x] %CPU:該進程使用掉的CPU資源百分比。
  • [x] %MEM:該進程所佔用的物理內存百分比。
  • [x] VSZ:該進程使用掉的虛擬內存量(單位Kbytes)
  • [x] RSS:該進程佔用的固定的內存量(單位Kbytes)
  • [x] TTY:該進程是在哪一個終端機上面運做的,若與終端機無關,則顯示「?」,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡鏈接進主機的進程。
  • [x] STAT:該進程目前的狀態,主要的狀態包括以下幾種。
    • R:正在運行,或者是能夠運行。
    • S:正在終端睡眠中,能夠由某些信號喚醒。
    • D:不可中斷睡眠。
    • T:正在偵測或者是中止了。
    • Z:已經終止,可是其父進程沒法正常終止它,從而變成zombie(殭屍)進程的狀態
    • +:前臺進程。
    • l:多線程進程。
    • N:低優先級進程。
    • <:高優先級進程。
    • s:進程領導者。
    • L:已將頁面鎖定到內存中。
  • [x] START:該進程被觸發啓動的時間
  • [x] TIME:該進程實際使用CPU運做的時間
  • [x] COMMAND:該進程的實際命令。

(4)顯示指定用戶的相關進程信息swift

[root@Mr_chen ~]# ps -u yunjisuan
   PID TTY          TIME CMD
  1315 pts/1    00:00:00 bash
  1335 pts/1    00:00:00 vim

(5) 以詳細格式顯示進程狀態

[root@Mr_chen ~]# ps -u yunjisuan -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1315   1314  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
0 T   500   1335   1315  0  80   0 - 35884 signal pts/1    00:00:00 vim

輸出信息中各列的說明以下

  • [x] F:表明這個進程的標誌(flag),4表明使用者爲super user。
  • [x] S:表明這個進程的狀態(STAT),前面已經講解過了
  • [x] UID:進程被該UID所擁有。
  • [x] PID:進程的標識號。
  • [x] PPID:父進程的ID。
  • [x] C:CPU使用的資源百分比。
  • [x] PRI:Priority(優先執行序)的縮寫
  • [x] NI:Nice值
  • [x] ADDR:指出該進程在內存的哪一個部分。若是是個running的進程,則通常是「-」。
  • [x] SZ:使用掉的內存大小。
  • [x] WCHAN:目前這個進程是否正在運做當中,若爲「-」則表示正在運做。
  • [x] TTY:該進程是在哪一個終端機上面運做的,若與終端機無關,則顯示「?」,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡鏈接進主機的進程。
  • [x] TIME:該進程實際使用CPU運做的時間
  • [x] CMD:該進程的實際命令

(6)查看某個進程在哪一個CPU上運行

[root@Mr_chen ~]# ps -eo pid,args,psr
   PID COMMAND                     PSR
     1 /sbin/init                    0  #CPU標記0表明第一個CPU
     2 [kthreadd]                    0
     3 [migration/0]                 0
     4 [ksoftirqd/0]                 0
     5 [migration/0]                 0
     6 [watchdog/0]                  0
     7 [events/0]                    0
     8 [cgroup]                      0
     9 [khelper]                     0

1.2 kill:終止進程

1.2.1 命令解釋

功能說明

kill命令可以終止你但願中止的進程

選項說明

參數選項 解釋說明(帶@爲重點)
-l 列出所有的信號名稱
-p 指定kill命令只打印相關進程的進程號,而不發送任何信號
-s 指定要發送的信號@

1.2.2 使用範例

(1)列出全部信號的名稱

[root@Mr_chen ~]# 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
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    
[root@Mr_chen ~]# kill -l kill #可使用-l參數對信號名和數字信號互換
9
[root@Mr_chen ~]# kill -l 9
KILL

經常使用信號:

信號 說明
HUP(1) 掛起,一般因終端掉線或用戶退出而引起
INT(2) 中斷,一般是按下Ctrl+c組合鍵來發出這個信號
QUIT(3) 退出,一般是按下CTRL+\組合鍵來發出這個信號
KILL(9) 當即結束進程的運行
TERM(15) 終止,一般在系統關機時發送
TSTP(20) 暫停進程的運行,一般是按下Ctrl+z組合鍵來發出這個信號

(2)終止進程

  • kill指令默認使用的信號爲15,用於結束進程。若是進程忽略此信號,則可使用信號9強制終止進程。
  • 通常是先經過ps等命令獲取到要終止進程的進程號,而後直接使用「kill 進程號」就能夠了。
kill 2203   #kill 命令默認使用的信號爲15,這種格式最經常使用、
kill -s 15 2203 #這種格式使用-s參數明確指定發送值爲15的信號,效果和kill 2203同樣
kill -15 2203   #上面的-s 15能夠簡寫爲-15

若是用上面的方法仍是沒法終止進程,那麼咱們就能夠用KILL(9)信號強制終止進程。

kill -9 2203    #信號9會強行終止進程,這會帶來一些反作用,如數據丟失,或者終端沒法恢復到正常狀態等,所以應儘可能避免使用,除非進程使用其餘信號沒法終止。

(3)擴展:特殊信號0的應用案例

在kill的全部信號中,有一個十分特殊的信號值0,使用格式爲kill -0 $pid。其中的-0表示不發送任何信號給$pid對應的進程,可是仍然會對$pid是否存在對應的進程進行檢查,若是$pid對應的進程已存在,則返回0,若不存在則返回1。

[root@Mr_chen ~]# pgrep -l sshd
985 sshd
1131 sshd
[root@Mr_chen ~]# kill -s 0 985
[root@Mr_chen ~]# echo $?
0
[root@Mr_chen ~]# kill -s 0 986
bash: kill: (986) - No such process
[root@Mr_chen ~]# echo $?
1

應用:若是同窗們想要寫一個管理系統服務的腳本,則可使用這個技巧。

1.3 killall:經過進程名終止進程

1.3.1 命令解釋

功能說明:

使用kill命令終止進程還須要先獲取進程的pid進程號,這個過程有點繁瑣,而使用killall命令就能夠直接用「kill 進程名」這種形式終止進程。

選項說明:

參數選項 解釋說明(帶@爲重點)
-I 不區分大小寫匹配
-g 終止屬於該進程組的進程
-i 在終止進程以前詢問是否確認
-l 列出全部已知的信號名
-q 若是沒有進程終止則不提示
-r 使用正則表達式匹配要終止的進程名稱
-s 用指定的信號代替默認信號
-u 終止指定用戶的進程@
-v 報告信號是否發送成功
-w 等待全部被終止的進程死去。killall每秒都會檢查一次被終止的進程是否仍然存在,其僅在都死光後才返回。注意,若是信號被忽略,或者沒有起做用,或者進程停留在殭屍狀態,那麼killall可能會永久等待@

1.3.2 使用範例

(1)終止定時任務服務進程的例子

首先咱們要知道定時任務的進程名是crond,終止該進程的命令以下:

[root@Mr_chen ~]# killall crond
[root@Mr_chen ~]# killall crond #用killall終止進程可執行屢次
crond: no process killed    #等看到這個結果說明進程死了
[root@Mr_chen ~]# 
[root@Mr_chen ~]# /etc/init.d/crond start #啓動服務
Starting crond:                                            [  OK  ]
[root@Mr_chen ~]# killall -w crond #使用-w參數,會看到等待幾秒後結束命令操做
[root@Mr_chen ~]# killall -w crond
crond: no process killed

(2)終止指定用戶的全部進程

[root@Mr_chen ~]# ps -u yunjisuan -l    #查看普通用戶的全部進程詳細信息
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
0 T   500   1235   1210  0  80   0 - 35884 signal pts/1    00:00:00 vim
[root@Mr_chen ~]# killall -u yunjisuan vim  #殺掉指定用戶的vim進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #成功
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash

特別提示:
這種方式能夠終止全部歸屬於yunjisuan用戶的vim進程。在以前,我在給同窗們講nginx優化時提到過nginx的監牢模式和在和給同窗們講解sudo時提到過企業的集權分治策略,他們都是利用普通用戶來啓動服務。此時,咱們能夠指定用戶殺死該用戶啓動的某一服務的全部進程。

1.4 pkill:經過進程名終止進程

1.4.1 命令解釋

功能說明:

pkill命令可經過進程名終止指定的進程。使用killall終止進程須要連續執行幾回,而pkill能夠殺死指定進程及其全部子進程。

選項說明:

參數選項 解釋說明(帶@爲重點)
-t終端 殺死指定終端的進程@
-u用戶 殺死指定用戶的進程@

1.4.2 使用範例

(1)經過進程名終止進程

[root@Mr_chen ~]# /etc/init.d/crond status #查看定時任務程序運行狀態
crond (pid  1274) is running...
[root@Mr_chen ~]# pkill crond #終止定時任務進程
[root@Mr_chen ~]# /etc/init.d/crond status 
crond dead but subsys locked    #進程被終止

(2)經過終端名終止進程

[root@Mr_chen ~]# w     #第二列TTY就是用戶運行的終端
 15:57:09 up  1:05,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
yunjisua tty1     -                15:55   12.00s  0.02s  0.01s vim ttt
root     pts/0    192.168.200.1    14:51    0.00s  0.07s  0.00s w
root     pts/1    192.168.200.1    15:19    3:28   0.01s  0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l    #查看用戶的進程
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1333   1322  0  80   0 - 27075 wait   tty1     00:00:00 bash
0 S   500   1359   1333  0  80   0 - 35890 poll_s tty1     00:00:00 vim
[root@Mr_chen ~]# pkill -t tty1     #殺掉終端正在運行的進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #vim進程沒了
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1333   1322  0  80   0 - 27075 n_tty_ tty1     00:00:00 bash
[root@Mr_chen ~]# pkill -9 -t tty1  #強行殺掉tty1終端(踢掉用戶)
[root@Mr_chen ~]# ps -u yunjisuan -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
[root@Mr_chen ~]# w     #tty1終端沒了
 15:58:17 up  1:06,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.200.1    14:51    0.00s  0.08s  0.00s w
root     pts/1    192.168.200.1    15:19    4:36   0.01s  0.00s bash

(3)經過用戶名終止進程

[root@Mr_chen ~]# w
 16:08:24 up  1:16,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
yunjisua tty1     -                16:01    4.00s  0.03s  0.02s -bash
root     pts/0    192.168.200.1    14:51    0.00s  0.09s  0.00s w
root     pts/1    192.168.200.1    15:19   14:43   0.01s  0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l    #查看用戶的進程信息
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1387   1366  0  80   0 - 27076 n_tty_ tty1     00:00:00 bash
0 T   500   1430   1387  0  80   0 - 35883 signal tty1     00:00:00 vim
[root@Mr_chen ~]# pkill -u yunjisuan    #殺掉指定用戶全部進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #成功
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1387   1366  0  80   0 - 27076 n_tty_ tty1     00:00:00 bash

1.5 top:實時顯示系統中各個進程的資源佔用情況

1.5.1 命令解釋

功能說明:

top命令用於實時地對系統處理器狀態進行監控,它可以實時地顯示系統中各個進程的資源佔用情況。該命令能夠按照CPU的使用,內存的使用和執行時間對系統任務進程進行排序顯示,同時top命令還能夠經過交互式命令進行設定顯示。

選項說明:

參數選項 解釋說明(帶@爲重點)
-a 將進程按照使用內存排序
-b 以批處理的模式顯示進程信息,輸出結果能夠傳遞給其餘程序或寫入到文件中。在這種模式下,top命令不會接受任何輸入,一直運行直到達到-n選項設置的閾值,或者按Ctrl+C等組合鍵終止程序
-c 顯示進程的整個命令路徑,而不是隻顯示命令名稱
-d 指定每兩次屏幕信息刷新之間的時間間隔
-H 指定這個能夠顯示每一個線程的狀況,不然就是進程的總的狀態
-i 不顯示閒置或者僵死的進程信息
-n top輸出信息更新的次數,完成後將退出top命令
-p 顯示指定的進程信息

1.5.2 使用範例

(1)顯示進程信息

root@Mr_chen ~]# top #使用top命令一般不接任何參數
top - 16:40:31 up  1:48,  3 users,  load average: 0.00, 0.00, 0.00
Tasks:  77 total,   1 running,  76 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   152112k used,   852300k free,    11312k buffers
Swap:  2031608k total,        0k used,  2031608k free,    42304k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
     1 root      20   0 19232 1536 1256 S  0.0  0.2   0:00.76 init                      
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                  
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0               
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
  • 第一行,任務隊列信息,同uptime命令的執行結果
    • [x] 16:40:31 當前系統時間
    • [x] up 1:48 系統已經運行了1小時48分
    • [x] 3 users 當前有2個用戶登陸系統
    • [x] load average:0.00, 0.00, 0.00 load average後面三個數分別是1分鐘、5分鐘、15分鐘的平均負載狀況
  • 第二行,Tasks爲任務(進程)。從上面的信息能夠看出,系統如今共有77個進程,其中處於運行狀態的有1個,76個在休眠(sleep),stoped狀態0個,zombie狀態(僵死)的有0個。
  • 第三行,CPU狀態信息
    • [x] 0.0%us 用戶空間佔用CPU的百分比
    • [x] 0.0%sy 內核空間佔用CPU的百分比
    • [x] 0.0%ni 改變過優先級的進程佔用CPU的百分比
    • [x] 100.0%id 空閒CPU百分比
    • [x] 0.0%wa I/O等待佔用CPU的百分比
    • [x] 0.0%hi 硬中斷(Hardware IRQ)佔用CPU的百分比
    • [x] 0.0%si 軟中斷(Software Interrupts)佔用CPU的百分比
    • [x] 0.0%st 虛擬機佔用CPU的百分比
  • 第四行,內存狀態
    • [x] 1004412k total 物理內存總量
    • [x] 152112k used 使用中的內存總量
    • [x] 852300k free 空閒內存總量
    • [x] 11312k buffers 緩衝的內存量
  • 第五行,swap交換分區信息
    • [x] 2031608k total 交換區總量
    • [x] 0k used 使用的交換區總量
    • [x] 2031608k free 空閒交換區總量
    • [x] 42304k cached 緩存的內存量
  • 第六行,空行
  • 第七行開始,給出的是各進程(任務)的狀態監控
    • [x] PID 進程id
    • [x] USER 進程全部者
    • [x] PR 進程優先級
    • [x] NI nice值,負值表示高優先級,正值表示低優先級。
    • [x] VIRT 進程使用的虛擬內存總量,單位kb。
    • [x] RES 進程使用的、未被換出的物理內存大小,單位爲kb。
    • [x] SHR 共享內存大小,單位爲kb
    • [x] S 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/中止 Z=殭屍進程
    • [x] %CPU 上次更新到如今的CPU時間佔用百分比
    • [x] %MEM 進程使用的物理內存百分比
    • [x] TIME+ 進程使用的CPU時間總計,單位1/100秒
    • [x] COMMAND 進程名稱(命令名/命令行)

特別提示:
1)計算真正可用的內存數爲:第四行的free+第四行的buffers+第五行的cached
2)在對內存進行監控時,咱們要時刻關注top命令裏第五行swap交換分區的used,若是這個數值還在不斷地變化,則說明內核正在不斷進行內存和swap的數據交換,這表示內存真的不夠用了或者程序運行有內存溢出問題。

(2)顯示多核不一樣核CPU的信息

在top基本視圖中,按鍵盤數字「1」,可監控每一個邏輯CPU的情況。

![1.png-42.8kB][2]

從上圖能夠發現,服務器有8個邏輯CPU,其實是2個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。

(2)將進程按照使用內存排序。

[root@Mr_chen ~]# top -a    #使用參數-a將進程按照使用內存排序
top - 18:07:36 up 42 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   153948k used,   850464k free,    10296k buffers
Swap:  2031608k total,        0k used,  2031608k free,    37868k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1236 root      20   0 98.0m 4036 3056 S  0.0  0.4   0:00.20 sshd                     
  1209 postfix   20   0 81524 3424 2544 S  0.0  0.3   0:00.01 qmgr                     
  1202 root      20   0 81272 3400 2496 S  0.0  0.3   0:00.03 master                   
  1208 postfix   20   0 81352 3380 2504 S  0.0  0.3   0:00.03 pickup

(3)以批處理模式顯示進程信息

[root@Mr_chen ~]# top -b        #使用參數-b能夠看到命令執行結果不停地向下刷新
......
  1229 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1231 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1233 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1235 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1236 root      20   0 98.0m 4036 3056 S  0.0  0.4   0:00.22 sshd                     
  1243 root      18  -2 12344 2580  516 S  0.0  0.3   0:00.00 udevd                    
  1244 root      18  -2 12344 2584  516 S  0.0  0.3   0:00.00 udevd                    
  1248 root      20   0  105m 1876 1520 S  0.0  0.2   0:00.04 bash                     
  1301 root      20   0 17384  668  452 S  0.0  0.1   0:00.00 anacron                  
  1318 root      20   0 15032 1340  984 R  0.0  0.1   0:00.01 top                      
^C  #退出使用快捷鍵Ctrl+C

(4)顯示進程的完整路徑

[root@Mr_chen chen]# top -c #使用參數-c顯示進程的整個命令路徑。
top - 18:19:38 up 54 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   154196k used,   850216k free,    10316k buffers
Swap:  2031608k total,        0k used,  2031608k free,    37904k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
     1 root      20   0 19232 1484 1220 S  0.0  0.1   0:00.98 /sbin/init               
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.01 [kthreadd]               
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 [migration/0]

(5) 設置執行top命令後的信息刷新時間

[root@Mr_chen chen]# top -d 3 #使用參數-d指定更新週期爲3秒,也就是說命令結果每隔3s刷新一次

(6)設置執行top命令後的信息刷新次數

[root@Mr_chen chen]# top -n 2 #使用參數-n指定更新次數爲2次,也就是說命令結果刷新兩次後終止退出,-n參數能夠和-b參數配合使用

(7)將top輸出結果的所有信息輸出到文件中

[root@Mr_chen chen]# top -b -n1 > test #以批處理方式,就刷新1次數據重定向到文件裏
[root@Mr_chen chen]# cat test | wc -l
171
[root@Mr_chen chen]# top -n1 > test #若是不是批處理方式,數據量少
[root@Mr_chen chen]# cat test | wc -l
28

特別提示:
在工做中,若是沒有必要,咱們儘可能不要在服務器上直接用top無任何參數的方式查看,由於這樣會很是佔用系統的資源。咱們可使用top -b -n1 > test的方式將數據重定向到文件裏,再進行查看。

(8)顯示指定的進程信息

[root@Mr_chen chen]# top -p 1126    #使用-p選項顯示指定進程號的信息
top - 18:31:18 up  1:06,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   154032k used,   850380k free,    10448k buffers
Swap:  2031608k total,        0k used,  2031608k free,    38060k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1126 root      20   0 66604 1184  468 S  0.0  0.1   0:00.00 sshd

(9)顯示指定用戶的信息

[root@Mr_chen chen]# top -u yunjisuan   #使用-u參數顯示指定用戶的進程信息
top - 18:33:05 up  1:08,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 165 total,   1 running, 164 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   160388k used,   844024k free,    10796k buffers
Swap:  2031608k total,        0k used,  2031608k free,    41696k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1384 yunjisua  20   0  105m 1896 1528 S  0.0  0.2   0:00.01 bash                     
  1403 yunjisua  20   0  140m 3968 2684 S  0.0  0.4   0:00.01 vim

1.6 nohup:用戶退出系統進程繼續工做

1.6.1 命令解釋

功能說明:

  • nohup命令能夠將程序以忽略掛起信號的方式運行起來,被運行程序的輸出信息將不會顯示到終端。
  • 不管是否將nohup命令的輸出重定向到終端,輸出都將寫入到當前目錄的nohup.out文件中。若是當前目錄的nohup.out文件不可寫,則輸出重定向到$HOME/nohup.out文件中。

1.6.2 使用範例

(1)讓執行的命令在當前會話終止後繼續保持運行。

正常狀況下,若是用戶退出登陸或會話終止,則用戶正在執行並可持續一段時間的命令(非守護進程)將自動終止。使用nohup命令能夠實如今用戶退出或當前會話終止後繼續保持運行,具體的例子以下:

[root@Mr_chen ~]# cd chen/
[root@Mr_chen chen]# nohup ping www.baidu.com   #讓當前執行的進程始終運行,關閉界面也不消失
nohup: ignoring input and appending output to `nohup.out'
^C[root@Mr_chen chen]# ls
nohup.out  test
[root@Mr_chen chen]# cat nohup.out #命令的執行記錄會被記錄在當前目錄下的nohup.out中
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=4.22 ms
64 bytes from 61.135.169.125: icmp_seq=2 ttl=128 time=4.28 ms
64 bytes from 61.135.169.125: icmp_seq=3 ttl=128 time=4.20 ms
64 bytes from 61.135.169.125: icmp_seq=4 ttl=128 time=4.21 ms
64 bytes from 61.135.169.125: icmp_seq=5 ttl=128 time=4.16 ms
64 bytes from 61.135.169.125: icmp_seq=6 ttl=128 time=4.11 ms
64 bytes from 61.135.169.125: icmp_seq=7 ttl=128 time=4.22 ms
64 bytes from 61.135.169.125: icmp_seq=8 ttl=128 time=4.18 ms
64 bytes from 61.135.169.125: icmp_seq=9 ttl=128 time=4.21 ms

--- www.a.shifen.com ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8508ms
rtt min/avg/max/mdev = 4.114/4.203/4.285/0.097 ms

在工做中咱們通常會配合&符號運行nohup命令,讓程序直接在後臺運行

[root@Mr_chen chen]# w #用戶yunjisuan的客戶端已經退出
 05:45:29 up 8 min,  1 user,  load average: 0.00, 0.02, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.200.1    05:37    0.00s  0.12s  0.00s w
[root@Mr_chen chen]# ps -u yunjisuan -l #可是用戶的ping進程還在
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 4 S 500 1332 1 0 80 0 - 27394 poll_s ? 00:00:00 ping [root@Mr_chen chen]# tail -f /home/yunjisuan/nohup.out #nohup.out文件一直在記錄信息
64 bytes from 61.135.169.125: icmp_seq=24 ttl=128 time=4.26 ms
64 bytes from 61.135.169.125: icmp_seq=25 ttl=128 time=4.24 ms
64 bytes from 61.135.169.125: icmp_seq=26 ttl=128 time=4.14 ms
64 bytes from 61.135.169.125: icmp_seq=27 ttl=128 time=4.28 ms
64 bytes from 61.135.169.125: icmp_seq=28 ttl=128 time=6.25 ms
64 bytes from 61.135.169.125: icmp_seq=29 ttl=128 time=4.10 ms

1.7 strace:跟蹤進程的系統調用

1.7.1 命令解釋

功能說明

strace是Linux環境下的一款程序調試工具,用於檢查一個應用程序所使用的系統調用以及它所接收的系統信息。strace會追蹤程序運行時的整個生命週期,輸出每個系統調用的名字、參數、返回值和執行所消耗的時間等,是高級運維和開發人員排查問題的殺手鐗。

選項說明

參數選項 解釋說明(帶@爲重點)
-c 統計每個系統調用所執行的算時間、次數和出錯的次數等
-d 輸出strace關於標準錯誤的調試信息
-f 跟蹤目標進程,以及目標進程建立的全部子進程@
-ff 若是提供-o filename,則將全部進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號
-i 輸出系統調用的入口指針
-q 禁止輸出關於脫離的消息
-r 輸出每個系統調用的相對時間
-t 在輸出中的每一行前加上時間信息。例如:16:45:28
-tt 在輸出中的每一行前加上時間信息,精確到微秒。例如11:18:59.759546@
-ttt 在輸出中的每一行前加上時間信息,精確到微秒,並且時間表示爲UNIX時間戳。例如1486111461.650434
-T 顯示每次系統調用所花費的時間
-v 對於某些相關調用,把完整的環境變量、文件stat結構等打印出來
-x 以十六進制形式輸出非標準字符串
-xx 全部字符串以十六進制形式輸出
-o filename 將strace的輸出寫入文件filename
-p pid 指定要跟蹤的進程pid,要同時跟蹤多個pid,重複屢次-p選項便可@
-s strsize 指定輸出的字符串的最大長度,默認爲32.並無將文件名視爲字符串,默認所有輸出
-u username 以username的UID和GID執行所跟蹤的命令

輸出過濾器

參數選項 解釋說明(帶@爲重點)
-e expr 輸出過濾器,經過表達式,能夠過濾掉你不想要的輸出@
-e trace=open 表示只跟蹤open調用而-e trace!=open表示跟蹤除open外全部
-e trace=file 只跟蹤與文件操做有關的系統調用
-e trace=process 只跟蹤與進程有關的系統調用
-e trace=network 只跟蹤與網絡有關的系統調用
-e trace=signal 只跟蹤與系統信號有關的系統調用
-e trace=desc 只跟蹤與文件描述符有關的系統調用
-e trace=ipc 只跟蹤與進程通訊有關的系統調用

1.7.2 使用範例

(1)排查Nginx 403 forbidden錯誤

[root@localhost tmp]# strace -tt -f -o /tmp/test.txt /usr/local/nginx/sbin/nginx #f參數跟蹤目標進程,以及目標進程建立的全部子進程,-tt參數在輸出中的每一行前加上時間信息,-o將跟蹤內容輸出到文件裏。
[root@localhost tmp]# cat test.txt 
3824  05:37:14.300486 prctl(PR_SET_DUMPABLE, 1) = 0
3824  05:37:14.300498 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
3824  05:37:14.300518 epoll_create(512) = 8
3824  05:37:14.300535 eventfd2(0, 0)    = 9
3824  05:37:14.300549 epoll_ctl(8, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLET, {u32=7095968, u64=7095968}}) = 0
3824  05:37:14.300569 mmap(NULL, 233472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f73714f7000
3824  05:37:14.300607 brk(0x1fa5000)    = 0x1fa5000
3824  05:37:14.300693 epoll_ctl(8, EPOLL_CTL_ADD, 6, {EPOLLIN|0x2000, {u32=1901031440, u64=140133798998032}}) = 0
3824  05:37:14.300712 close(3)          = 0
3824  05:37:14.300724 epoll_ctl(8, EPOLL_CTL_ADD, 7, {EPOLLIN|0x2000, {u32=1901031664, u64=140133798998256}}) = 0
3824  05:37:14.300742 epoll_wait(8,     #epoll_wait表示等待鏈接訪問,所以後面的輸出都是和前一次訪問有關的,下面咱們仔細看一下日誌輸出。

咱們先將test.txt文件的內容清空,而後模擬去訪問nginx

[root@localhost tmp]# cat test.txt 
{{EPOLLIN, {u32=1901031440, u64=140133798998032}}}, 512, 4294967295) = 1
3824  05:57:59.271342 accept4(6, {sa_family=AF_INET, sin_port=htons(64469), sin_addr=inet_addr("192.168.0.254")}, [16], SOCK_NONBLOCK) = 3
3824  05:57:59.271383 epoll_ctl(8, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET|0x2000, {u32=1901031888, u64=140133798998480}}) = 0
3824  05:57:59.271401 epoll_wait(8, {{EPOLLIN, {u32=1901031888, u64=140133798998480}}}, 512, 60000) = 1
3824  05:57:59.271423 recvfrom(3, "GET / HTTP/1.1\r\nHost: 192.168.0."..., 1024, 0, NULL, NULL) = 308        #recvfrom接收到get請求
3824  05:57:59.271483 stat("/usr/local/nginx/html/www/index.html", 0x7fff69246350) = -1 ENOENT (No such file or directory)     #查看index.html文件不存在
3824  05:57:59.271506 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
3824  05:57:59.271525 stat("/usr/local/nginx/html/www/index.htm", 0x7fff69246350) = -1 ENOENT (No such file or directory)     #查看index.htm文件不存在
#下面向用戶返回403錯誤,並寫入錯誤日誌
3824  05:57:59.271546 write(5, "2018/01/14 05:57:59 [error] 3824"..., 200) = 200
3824  05:57:59.271587 writev(3, [{"HTTP/1.1 403 Forbidden\r\nServer: "..., 155}, {"<html>\r\n<head><title>403 Forbidd"..., 116}, {"<hr><center>nginx/1.10.2</center"..., 53}], 3) = 324
3824  05:57:59.271674 write(4, "192.168.0.254 - - [14/Jan/2018:0"..., 151) = 151
3824  05:57:59.271693 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
3824  05:57:59.271708 recvfrom(3, 0x1f3e190, 1024, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
3824  05:57:59.271722 epoll_wait(8, 
#從上面的日誌輸出中,咱們能夠得知是由於2個文件不存在致使的403錯誤,所以咱們檢查配置文件就很容易發現問題。
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html/www;
            index  index.html index.htm;        #這裏缺乏了設置首頁文件
        }
    }

(2)只跟蹤與文件操做有關的系統調用

若是命令結果的輸出實在太多了,很容易看花眼,所以可使用過濾器,過濾掉無關的信息,好比只查看文件操做信息。

[root@localhost tmp]# strace -tt -f -e trace=file -o /tmp/test.txt /usr/local/nginx/sbin/nginx
[root@localhost tmp]# cat test.txt 
3860  06:28:42.306924 stat("/usr/local/nginx/html/www/index.html", 0x7fff3ce39670) = -1 ENOENT (No such file or directory)
3860  06:28:42.306973 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
3860  06:28:42.306994 stat("/usr/local/nginx/html/www/index.htm", 0x7fff3ce39670) = -1 ENOENT (No such file or directory)

(3)經過pid跟蹤進程

[root@localhost tmp]# /usr/local/nginx/sbin/nginx #啓動nginx服務
[root@localhost tmp]# pgrep nginx -l
3873 nginx  #nginx的master進程
3874 nginx  #nginx的worker進程
[root@localhost tmp]# strace -tt -f -e trace=file -p 3874 #使用-p參數,只跟蹤worker進程,結果更加精簡
Process 3874 attached - interrupt to quit
06:49:38.629248 stat("/usr/local/nginx/html/www/index.html", 0x7fffbd4e7fc0) = -1 ENOENT (No such file or directory)
06:49:38.629329 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
06:49:38.629353 stat("/usr/local/nginx/html/www/index.htm", 0x7fffbd4e7fc0) = -1 ENOENT (No such file or directory)

(4)跟蹤系統調用統計

strace不只可以追蹤系統調用,使用選項-c還能對進程全部的系統調用作一個統計分析

[root@localhost tmp]# strace -c /usr/local/nginx/sbin/nginx #使用-c參數爲進程全部的系統調用作一個統計分析
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000047          47         1           clone
  0.00    0.000000           0        29           read
  0.00    0.000000           0        31           open
  0.00    0.000000           0        33           close
  0.00    0.000000           0         6           stat
  0.00    0.000000           0        28           fstat
  0.00    0.000000           0         1           lseek
  0.00    0.000000           0        61           mmap
  0.00    0.000000           0        36           mprotect
  0.00    0.000000           0         7           munmap
  0.00    0.000000           0         6           brk
  0.00    0.000000           0        14           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           ioctl
  0.00    0.000000           0         2           pread
  0.00    0.000000           0         2         2 access
  0.00    0.000000           0         5           socket
  0.00    0.000000           0         4         4 connect
  0.00    0.000000           0         1           bind
  0.00    0.000000           0         2           listen
  0.00    0.000000           0         1           setsockopt
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           uname
  0.00    0.000000           0         3           fcntl
  0.00    0.000000           0         5         5 mkdir
  0.00    0.000000           0         3           getrlimit
  0.00    0.000000           0         1           geteuid
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           epoll_create
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000047                   294        12 total

上面的結果將清楚地告訴咱們調用了哪些系統函數,調用的次數是多少,消耗了多少時間等信息,這對咱們分析程序來講是很是有用的。

(5)重定向輸出

[root@localhost tmp]# strace -c -o /tmp/test.txt /usr/local/nginx/sbin/nginx #-o選項將strace的結果輸出到文件中
[root@localhost tmp]# cat test.txt 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0        29           read
  -nan    0.000000           0        31           open
  -nan    0.000000           0        33           close
  -nan    0.000000           0         6           stat

(6)對系統調用進行計時

[root@localhost tmp]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost tmp]# strace -T /usr/local/nginx/sbin/nginx #使用-T將每一個系統調用所花費的時間打印出來,每一個調用的時間花銷在調用行最右邊的尖括號裏
execve("/usr/local/nginx/sbin/nginx", ["/usr/local/nginx/sbin/nginx"], [/* 24 vars */]) = 0 <0.000075> brk(0) = 0x1055000 <0.000003> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbbf84f6000 <0.000004> access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000005> open("/etc/ld.so.cache", O_RDONLY) = 3 <0.000004> fstat(3, {st_mode=S_IFREG|0644, st_size=15441, ...}) = 0 <0.000003> mmap(NULL, 15441, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbbf84f2000 <0.000003> close(3) = 0 <0.000003> open("/lib64/libdl.so.2", O_RDONLY) = 3 <0.000005> read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832 <0.000003> fstat(3, {st_mode=S_IFREG|0755, st_size=19536, ...}) = 0 <0.000003> mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbbf80d4000 <0.000004> mprotect(0x7fbbf80d6000, 2097152, PROT_NONE) = 0 <0.000004> ......

1.7.3 小結

strace命令很適合處理程序殭屍、命令執行報錯等問題。若是從程序日誌和系統日誌中看不出問題出現的緣由,則能夠strace一下,也許會有答案,不過也須要使用者有足夠的耐心去查看輸出。

1.8 ltrace :跟蹤進程調用庫函數

1.8.1 命令解釋

功能說明:

ltrace可以跟蹤進程的庫函數調用,它會顯現出調用了哪一個庫函數,而strace則是跟蹤進程的每一個系統調用

選項說明:

參數選項 解釋說明(帶@爲重點)
-c 統計庫函數每次調用的時間,最後程序退出時打印摘要
-C 解碼低級別名稱(內核級)爲用戶級名稱
-d 打印調試信息
-e expr 輸出過濾器,經過表達式,能夠過濾掉你不想要的輸出@
-e printf 表示只查看printf函數調用
-f 跟蹤子進程
-o filename 將ltrace的輸出寫入文件filename
-p pid 指定要跟蹤的進程pid@
-r 輸出每個調用的相對時間
-S 顯示系統調用
-t 在輸出中每一行前加上時間信息。例如 16:45:28
-tt 在輸出中每一行前加上時間信息。例如 11:18:59.759546
-ttt 在輸出中每一行前加上時間信息,精確到微妙,並且時間表示爲UNIX時間戳。
-T 顯示每次調用所花費時間
-u username 以username的UID和GID執行所跟蹤的命令

1.8.2 使用範例

(1)ltrace使用

ltrace的用法與strace很是類似,選項功能也是相似,下面簡單看一下ltrace命令的執行結果

[root@localhost tmp]# ltrace /usr/local/nginx/sbin/nginx    #ltrace後面直接接上要檢測的命令語句
memcpy(0x1d5b7b0, "www.yunjisuan.com", 17)                              = 0x1d5b7b0
memcpy(0x1d5b7c1, "/usr/local/nginx/", 17)                              = 0x1d5b7c1
malloc(2048)                                                            = 0x1d55530
memset(0x1d55530, '\000', 68)                                           = 0x1d55530
memset(0x1d55530, '\000', 70)                                           = 0x1d55530
memset(0x1d55530, '\000', 72)                                           = 0x1d55530
memset(0x1d55530, '\000', 74)                                           = 0x1d55530
memset(0x1d55530, '\000', 76)                                           = 0x1d55530
memset(0x1d55530, '\000', 78)                                           = 0x1d55530
memset(0x1d55530, '\000', 80)                                           = 0x1d55530
memset(0x1d55530, '\000', 82)                                           = 0x1d55530
memset(0x1d55530, '\000', 84)                                           = 0x1d55530
memset(0x1d55530, '\000', 86)                                           = 0x1d55530
......
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(17, 0x7fffb75519f0, NULL)                                     = 0
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(31, 0x7fffb75519f0, NULL)                                     = 0
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(13, 0x7fffb75519f0, NULL)                                     = 0
fork()                                                                  = 3962
[pid 3961] exit(0 <unfinished ...>
[pid 3961] +++ exited (status 0) +++

(2)經過pid跟蹤進程調用庫函數

[root@localhost tmp]# pgrep -l nginx
3967 nginx
3968 nginx          #nginx的worker進程的pid號
[root@localhost tmp]# ltrace -p 3968 使用-p指定進程號
__errno_location()                                                      = 0x7f0a392e1768
gettimeofday(0x7fff8f684cd0, NULL)                                      = 0
memcpy(0x6b281f, "14", 2)                                               = 0x6b281f
memcpy(0x6b2826, "2018", 4)                                             = 0x6b2826
memcpy(0x6b282b, "12", 2)                                               = 0x6b282b
memcpy(0x6b282e, "28", 2)                                               = 0x6b282e
memcpy(0x6b2831, "30", 2)                                               = 0x6b2831
localtime_r(0x7fff8f684c88, 0x7fff8f684d20, 0x48400a, 12339, 0x7fff8f684b52) = 0x7fff8f684d20
memcpy(0x6b22fc, "2018", 4)                                             = 0x6b22fc
memcpy(0x6b2302, "1", 1)                                                = 0x6b2302
memcpy(0x6b2304, "14", 2)                                               = 0x6b2304
memcpy(0x6b2308, "7", 1)                                                = 0x6b2308
memcpy(0x6b230a, "28", 2)                                               = 0x6b230a
memcpy(0x6b230d, "30", 2)                                               = 0x6b230d
memcpy(0x6b2f91, "14", 2)                                               = 0x6b2f91
memcpy(0x6b2f98, "2018", 4)                                             = 0x6b2f98
memcpy(0x6b2f9e, "7", 1)                                                = 0x6b2f9e
memcpy(0x6b2fa0, "28", 2)                                               = 0x6b2fa0
memcpy(0x6b2fa3, "30", 2)                                               = 0x6b2fa3
memcpy(0x6b2fa8, "5", 1)                                                = 0x6b2fa8
memcpy(0x6b2faa, "0", 1)                                                = 0x6b2faa
memcpy(0x6b364e, "2018", 4)                                             = 0x6b364e
memcpy(0x6b3654, "1", 1)                                                = 0x6b3654
memcpy(0x6b3656, "14", 2)                                               = 0x6b3656
memcpy(0x6b365a, "7", 1)                                                = 0x6b365a
memcpy(0x6b365c, "28", 2)                                               = 0x6b365c
memcpy(0x6b365f, "30", 2)                                               = 0x6b365f
memcpy(0x6b3663, "5", 1)                                                = 0x6b3663
memcpy(0x6b3666, "0", 1)                                                = 0x6b3666
memcpy(0x6b3cb4, "14", 2)                                               = 0x6b3cb4
memcpy(0x6b3cb8, "7", 1)                                                = 0x6b3cb8
memcpy(0x6b3cba, "28", 2)                                               = 0x6b3cba
memcpy(0x6b3cbd, "30", 2)                                               = 0x6b3cbd
epoll_wait(8, 0x2639990, 512, 0xffffffff, 0x7fff8f684b52

二,Linux核心網絡管理命令

2.1 ip:網絡配置工具

2.1.1 命令解釋

功能說明:

ip命令是iproute軟件包中的一個強大的網絡配置工具,用於顯示或管理Linux系統的路由,網絡設備,策略路由和隧道

選項說明:

參數選項 解釋說明(帶@的爲重點)
-s 輸出更詳細的信息,爲了類似更詳細的信息,可重複使用此選項
-r 顯示主機時,不使用IP地址,而是使用主機的域名
網絡對象 指定要管理的網絡對象(link:網絡設備 address:IP地址 addrlabel:協議地址標籤管理 route:路由表 rule:策略路由表 runnel:IP隧道 )
help ip help:查看ip命令的幫助 ip【object】help:查看指定的網絡對象的幫助
操做命令 對指定的網絡對象完成的具體操做。一般,每個具體操做的命令後面又有一組相關的命令選項。不一樣的操做對象所支持的操做命令也不一樣。下面按照操做的網絡對象給出所支持的常見操做命令
  link對象支持的操做命令:set(修改設備屬性),show(顯示設備屬性)
  address對象支持的操做命令:add(添加協議地址),del(刪除協議地址),flush(清除協議地址),show(查看協議地址)
  addrlabel對象支持的操做命令:add,del,list,flush
  route對象支持的操做命令:add,change,replace,delete,show,flush,get
  rule對象支持的操做命令:add,delete,flush,show
  tunnel對象支持的操做命令:add,change,delete,prl,show

2.1.2 使用範例

(1)顯示網絡設備屬性

[root@Mr_chen ~]# ip link show eth0 #顯示eth1網卡屬性
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip -s link show eth0  #顯示詳細屬性
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
 RX: bytes  packets  errors  dropped overrun mcast   #顯示每一個網絡設備上數據包的統計信息
    37242      432      0       0       0       0      
 TX: bytes  packets  errors  dropped carrier collsns 
    22769      178      0       0       0       0      
[root@Mr_chen ~]# ip -s -s link show eth0   #使用兩個-s顯示更詳細屬性
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
 RX: bytes  packets  errors  dropped overrun mcast   
    44464      523      0       0       0       0      
    RX errors: length  crc     frame   fifo    missed
               0        0       0       0       0      
 TX: bytes  packets  errors  dropped carrier collsns 
    26699      209      0       0       0       0      
    TX errors: aborted fifo    window  heartbeat
               0        0       0       0

(2)關閉和激活網絡設備

[root@Mr_chen ~]# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link set eth1 up #激活eth1網卡
[root@Mr_chen ~]# ip link show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link set eth1 down #關閉eth1網卡
[root@Mr_chen ~]# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff

(3)修改網卡MAC地址

[root@Mr_chen ~]# ip link show eth1 
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5a brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link set eth1 address 0:0c:29:a8:ca:5f #修改MAC地址
[root@Mr_chen ~]# ip link show eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff

(4)查看網卡信息

[root@Mr_chen ~]# ip a #效果與ip address同樣,顯示的結果包括激活和未激活的網卡
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.100/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fea8:ca50/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip link #和ip a對比,少了具體的IP地址信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:50 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff

(5)添加或刪除IP地址

root@Mr_chen ~]# ip a show eth1 #顯示eth1的IP地址,沒有配置
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
[root@Mr_chen ~]# ip a add 192.168.0.222/24 dev eth1 #添加一個IP地址
[root@Mr_chen ~]# ip a show eth1 #雖然顯示出了IP地址,可是網卡狀態仍是down
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
[root@Mr_chen ~]# ip link set eth1 up #激活網卡
[root@Mr_chen ~]# ip a show eth1 #如今eth1網卡正常運行
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ip a add 192.168.0.223/24 dev eth1 #可添加多個IP,這種IP稱爲輔助IP
[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
    inet 192.168.0.223/24 scope global secondary eth1
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ip a del 192.168.0.222/24 dev eth1 #刪除主IP也就是第一個IP地址
[root@Mr_chen ~]# ip a show eth1 #全部IP都沒有了
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ip a add 192.168.0.222/24 dev eth1 #添加兩個IP地址
[root@Mr_chen ~]# ip a add 192.168.0.223/24 dev eth1
[root@Mr_chen ~]# ip a del 192.168.0.223/24 dev eth1 #刪除輔助IP
[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1     #主IP仍舊被保留了
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever

小結:

  • [x] :刪除網卡的主IP地址,同時會刪除該網卡的全部IP地址
  • [x] :刪除網卡的輔助IP地址,不會影響該網卡的其餘IP地址。

思考
咱們該如何用ip命令建立網卡的別名IP呢?

[root@Mr_chen ~]# ip a add 192.168.0.225/24 dev eth1 label eth1:1 #使用label選項建立別名IP
[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1 #eth1網卡的主IP
    inet 192.168.0.223/24 scope global secondary eth1   #eth1網卡的輔助IP
    inet 192.168.0.225/24 scope global secondary eth1:1 #eth1網卡的別名IP
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever

知識擴展:
咱們利用ifconfig命令只能查看到網卡的別名IP而看不到它的輔助IP

[root@Mr_chen ~]# ip a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a8:ca:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.222/24 scope global eth1
    inet 192.168.0.223/24 scope global secondary eth1   #輔助IP
    inet 192.168.0.225/24 scope global secondary eth1:1 #別名IP
    inet6 fe80::20c:29ff:fea8:ca5f/64 scope link 
       valid_lft forever preferred_lft forever
[root@Mr_chen ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:A8:CA:50  
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fea8:ca50/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5857 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1019 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
          RX bytes:420049 (410.2 KiB)  TX bytes:119175 (116.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:A8:CA:5F  
          inet addr:192.168.0.222  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fea8:ca5f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:32 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
          RX bytes:4212 (4.1 KiB)  TX bytes:936 (936.0 b)

eth1:1    Link encap:Ethernet  HWaddr 00:0C:29:A8:CA:5F     #別名IP
          inet addr:192.168.0.225  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

(6)查看路由表

[root@Mr_chen ~]# ip route
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.100 
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.222 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 192.168.0.1 dev eth0 
[root@Mr_chen ~]# ip route | column -t  #使用column命令格式化,選項-t,默認根據空格分隔判斷輸入行的列數來建立一個表
192.168.0.0/24  dev  eth0         proto  kernel  scope   link  src  192.168.0.100
192.168.0.0/24  dev  eth1         proto  kernel  scope   link  src  192.168.0.222
169.254.0.0/16  dev  eth0         scope  link    metric  1002
default         via  192.168.0.1  dev    eth0
[root@Mr_chen ~]# route -n  #與咱們前面學習過的route命令對比一下
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0

(7)添加或刪除路由表

[root@Mr_chen ~]# ip route add 192.168.1.0/24 via 192.168.0.254 dev eth1    #添加靜態路由
[root@Mr_chen ~]# ip route | column -t
192.168.1.0/24  via  192.168.0.254  dev    eth1
192.168.0.0/24  dev  eth0           proto  kernel  scope   link  src  192.168.0.100
192.168.0.0/24  dev  eth1           proto  kernel  scope   link  src  192.168.0.222
169.254.0.0/16  dev  eth0           scope  link    metric  1002
default         via  192.168.0.1    dev    eth0
[root@Mr_chen ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     192.168.0.254   255.255.255.0   UG    0      0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
[root@Mr_chen ~]# ip route del 192.168.1.0/24   #刪除靜態路由
[root@Mr_chen ~]# ip route | column -t
192.168.0.0/24  dev  eth0         proto  kernel  scope   link  src  192.168.0.100
192.168.0.0/24  dev  eth1         proto  kernel  scope   link  src  192.168.0.222
169.254.0.0/16  dev  eth0         scope  link    metric  1002
default         via  192.168.0.1  dev    eth0

2.2 netstat:查看網絡狀態

2.2.1 命令詳解

功能說明:

netstat命令用於顯示本機網絡的鏈接狀態,運行端口和路由表等信息。

選項說明:

參數選項 解釋說明(帶@的爲重點)
-r 顯示路由表信息,該功能相似與前面學過的route和ip route
-g 顯示多播功能羣組成員,該功能相似於前面學過的ip maddr
-i 顯示網絡接口信息,該功能相似於前面學過的ip -s link
-s 顯示各種協議的統計信息
-n 顯示數字形式的地址而不是去解析主機,端口或用戶名。默認狀況下,netstat命令會嘗試解析並顯示主機的主機名,這個過程一般比較長也是非必需的@
-a 顯示處於監聽狀態和非監聽狀態的socket信息@
-A 顯示指定網絡類型的網絡鏈接狀態
-c<秒數> 後面跟的秒數表示每隔幾秒就刷新顯示一次@
-l 僅顯示鏈接狀態爲「LISTEN」的服務的網絡狀態
-t 顯示全部的TCP鏈接狀況@
-u 顯示全部的UDP鏈接狀況@
-p 顯示socket所屬進程的PID和名稱@

2.2.2 使用範例

基礎範例

(1)經常使用選項組合一

[root@localhost ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0     64 192.168.0.233:22            192.168.0.253:54737         ESTABLISHED 
tcp        0      0 :::22                       :::*                        LISTEN      
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     7510   @/com/ubuntu/upstart
unix  2      [ ]         DGRAM                    7857   @/org/kernel/udev/udevd
unix  4      [ ]         DGRAM                    8910   /dev/log
unix  2      [ ]         DGRAM                    9187   
unix  2      [ ]         DGRAM                    8976   
unix  3      [ ]         DGRAM                    7874   
unix  3      [ ]         DGRAM                    7873

第一行活動網絡鏈接說明:

列數 名稱 含義
第一列 Proto socket使用的協議(TCP,UDP,RAW)
第二列 Recv-Q 接收到可是還未處理的字節數
第三列 Send-Q 已經發送可是未被遠程主機確認收到的字節數
第四列 Local Address 本地主機地址和端口
第五列 Foreign Address 遠程主機地址和端口
第六列 State socket的狀態,一般僅僅有TCP的狀態,狀態值可能有ESTABLISHED,SYN_SENT,SYN_RECV,FIN_WAIT1,FIN_WAIT2,TIME_WAIT等

第6列State狀態信息詳解

狀態 含義
ESTABLISHED socket已經創建鏈接,表示處於鏈接的狀態,通常認爲有一個ESTABLISHED是一個服務的併發鏈接。該鏈接狀態在生產場景中很重要,須要重點關注
SYN_SENT socket正在積極嘗試創建一個鏈接,即處於發送後鏈接前的一個等待但未匹配進入鏈接的狀態
SYN_RECV 已經從網絡上收到一個鏈接請求
FIN_WAIT1 socket已關閉,鏈接正在或正要關閉
FIN_WAIT2 鏈接已關閉,而且socket正在等待遠端結束
TIME_WAIT socket正在等待關閉處理仍在網絡上的數據包,這個鏈接狀態在生產場景中很重要,須要重點關注
CLOSED socket再也不被佔用了
CLOSE_WAIT 遠端已經結束,等待socket關閉
LAST_ACK 遠端已經結束,而且socket也已經關閉,等待acknowledgement
LISTEN socket正在監聽鏈接請求
CLOSING socket關閉,可是咱們仍舊沒有發送數據
UNKNOWN socket狀態未知

(2)經常使用選項組合二

[root@localhost ~]# netstat -lntup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      879/sshd            
tcp        0     64 192.168.0.233:22            192.168.0.253:54737         ESTABLISHED 923/sshd            
tcp        0      0 :::22                       :::*                        LISTEN      879/sshd

以上命令語句的做用爲顯示全部TCP和UDP正在監聽的鏈接信息

  • [x] -l : 顯示全部LISTEN狀態的網絡鏈接
  • [x] -n : 顯示IP地址,不進行DNS解析成主機名,域名
  • [x] -t : 顯示全部TCP鏈接
  • [x] -u : 顯示全部UDP鏈接
  • [x] -p : 顯示進程號和進程名

(3)顯示當前系統的路由表

[root@localhost ~]# netstat -rn #使用-r顯示路由表信息,-n不進行DNS解析,加快命令執行速度
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0

提示:該命令至關於route -n

(4)選項-i顯示網絡的接口情況

[root@localhost ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0     4103      0      0      0      403      0      0      0 BMRU
lo        16436   0        0      0      0      0        0      0      0      0 LRU

如下是命令結果解釋

  • [x] Iface : 表示網絡設備的接口名稱
  • [x] MTU : 表示最大傳輸單元,單位爲字節
  • [x] RX-OK/TX-OK : 表示已經準確無誤地接收/發送了多少數據包
  • [x] RX-ERR/TX-ERR : 表示接收/發送數據包時產生了多少錯誤
  • [x] RX-DRP/TX-DRP : 表示接收/發送數據包時丟棄了多少數據包
  • [x] RX-OVR/TX-OVR : 表示因爲偏差而遺失了多少數據包。
  • [x] Flg : 表示接口標記,其中各標記含義具體以下。
    • L : 表示該接口是個迴環設備。
    • B : 表示設置了廣播地址。
    • M : 表示接收全部數據包。
    • R : 表示接口正在運行。
    • U : 表示接口處於活動狀態。
    • O : 表示在該接口上禁用arp。
    • P : 表示一個點到點的鏈接

正常狀況下,RX-ERR/TX-ERR,RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都應該爲0,若是這幾個選項的值不爲0,而且很大,那麼網絡質量確定有問題,網絡傳輸性能也必定會降低。

生產案例

(5)統計各個狀態的網絡鏈接個數

[root@Mr_chen ~]# 
TIME_WAIT 6163
FIN_WAIT1 42
FIN_WAIT2 

netstat -n | awk '/^tcp/{Mr_chen[$NF]++}END{for(i in Mr_chen)print i,Mr_chen[i]}' 1056 ESTABLISHED 4542 SYN_RECV 53 LAST_ACK 30

2.3 ss : 查看網絡狀態

2.3.1 命令詳解

功能說明:

  • ss命令是相似並將取代netstat的工具,它能用來查看網絡狀態信息,包括TCP,UDP鏈接,端口等。它的優勢是可以顯示更多更詳細的有關網絡鏈接狀態的信息,並且比netstat更快速更高效。
  • 若是系統沒有ss命令,那就須要安裝一下,ss命令屬於iproute包,所以安裝命令是yum -y install iproute

選項說明:

參數選項 解釋說明(帶@的爲重點) 參數選項 解釋說明(帶@的爲重點)
-n 顯示IP地址,不進行DNS解析@ -s 顯示socket使用統計
-r 嘗試解析數字IP地址和端口 -4 僅顯示IPV4的socket
-a 顯示全部socket鏈接@ -6 僅顯示IPv6的socket
-l 顯示全部監聽socket@ -0 僅顯示PACKET的socket
-o 顯示計時器信息 -t 僅顯示TCP的socket@
-e 顯示詳細的socket信息 -u 僅顯示UDP的socket@
-m 顯示socket的內存使用狀況 -d 僅顯示DCCP的socket
-p 顯示使用socket的進程@ -w 僅顯示RAW的socket
-i 顯示TCP內部信息 -x 僅顯示Unix的socket

2.3.2 使用範例

(1)經常使用選項組合一

[root@Mr_chen ~]# ss -an    #顯示全部的socket鏈接
State       Recv-Q Send-Q                        Local Address:Port                          Peer Address:Port 
LISTEN      0      128                                      :::22                                      :::*     
LISTEN      0      128                                       *:22                                       *:*     
ESTAB       0      64                            192.168.0.233:22                           192.168.0.253:50985 
[root@Mr_chen ~]# ss -an | column -t    #上面的輸出寫在文檔中會有點亂,下面用column格式化一下。
State   Recv-Q  Send-Q  Local             Address:Port         Peer  Address:Port
LISTEN  0       128     :::22             :::*
LISTEN  0       128     *:22              *:*
ESTAB   0       64      192.168.0.233:22  192.168.0.253:50985

(2)經常使用選項組合二

[root@Mr_chen ~]# ss -lntup | column -t #顯示全部正在監聽的TCPUDP鏈接
Netid  State   Recv-Q  Send-Q  Local  Address:Port  Peer                    Address:Port
tcp    LISTEN  0       128     :::22  :::*          users:(("sshd",879,4))
tcp    LISTEN  0       128     *:22   *:*           users:(("sshd",879,3))

(3)顯示socket統計

[root@Mr_chen ~]# ss -s #統計當前的establishedclosedorphanedwaitingTCP socket數量
Total: 282 (kernel 285)
TCP:   3 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 1

Transport Total     IP        IPv6
*     285       -         -        
RAW   0         0         0        
UDP   0         0         0        
TCP   3         2         1        
INET      3         2         1        
FRAG      0         0         0

當服務器產生大量的socket鏈接時,一般會使用該命令來作宏觀數據統計;ss的大部分參數應用和netstat很像。

2.4 ping : 測試主機之間的網絡連通性

2.4.1 命令詳解

功能說明:

ping命令可用於測試主機之間網絡的連通性。執行ping命令會使用ICMP傳輸協議,發出要求迴應的信息,若遠端主機的網絡功能沒有問題,就會迴應該信息,於是可得知該主機運做正常。

選項說明:

參數選項 解釋說明(帶@的爲重點)
-c <次數> 指定發送ICMP報文的次數。不然,ping命令將一直髮送報文@
-i <時間間隔> 相鄰兩次發送報文的時間間隔,默認時間間隔1s@
-n 不查詢主機名,直接顯示其IP地址
-q 只顯示命令開始時的信息和運行結束的統計信息。忽略命令運行過程當中的輸出信息
-s <數據包大小> 設置發送數據包的大小,默認大小爲56字節,再加上8字節的ICMP頭,一共是64字節的ICMP包
-t <生存期> 設置發送的數據包其生存期(TTL)的值
-w 截止時間 超過截止時間,當即退出ping程序
-W 超時時間 等待響應的超時時間

2.4.2 使用範例

(1)測試到目標主機的網絡連通性

[root@localhost ~]# ping www.baidu.com  #ping命令直接接域名或IP,會一直顯示ping結果
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
#顯示ping的域名及其IP地址,發送的是56字節的數據
64 bytes from 61.135.169.121: icmp_seq=1 ttl=57 time=10.1 ms
#從目標主機收到的數據是64字節,icmp_seq是收到包的序列號,ttl是數據包的生存期,time是延遲。
64 bytes from 61.135.169.121: icmp_seq=2 ttl=57 time=46.4 ms
64 bytes from 61.135.169.121: icmp_seq=3 ttl=57 time=62.5 ms
^C  #直到Ctrl+c強制終止
--- www.a.shifen.com ping statistics ---    #這裏是ping的統計結果
3 packets transmitted, 3 received, 0% packet loss, time 2632ms  #發了3個包,收到3個,丟失率0%,時間爲2632ms
rtt min/avg/max/mdev = 10.175/39.730/62.569/21.911 ms
#rtt是傳輸的時間延遲。min/avg/max/mdev==>最小/平均/最大/算數平均差

擴展知識:

1)ping命令會顯示一個時間做爲衡量網絡參數延遲的參數,以判斷源主機與目標主機之間網絡的質量。
2)ping命令的輸出信息中含有TTL值。TTL(Time To Life)稱爲生存週期,它是ICMP報文在網絡上的存活時間。不一樣的操做系統發出的ICMP報文的生存期各不相同,常見的生存期爲32,64,128和255等。TTL值反映了ICMP報文所可以通過的路由器數目,每通過一個路由器,路由器都會將其數據包的生存期減去1,若是TTL值變爲0,則路由器將再也不轉發此報文。

(2)使用ping參數的不一樣組合的例子

[root@Mr_chen ~]# ping -c 3 -i 3 -s 1024 -t 255 www.baidu.com
PING www.baidu.com (61.135.169.121) 1024(1052) bytes of data.
1032 bytes from 61.135.169.121: icmp_seq=1 ttl=57 time=5.29 ms
1032 bytes from 61.135.169.121: icmp_seq=2 ttl=57 time=4.79 ms
1032 bytes from 61.135.169.121: icmp_seq=3 ttl=57 time=5.50 ms

--- www.baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6014ms
rtt min/avg/max/mdev = 4.795/5.198/5.507/0.304 ms

如下是命令說明

  • [x] -c 3:發送3次ICMP包
  • [x] -i 3:每次發包時間間隔爲3s
  • [x] -s 1024:設置發送的數據包大小爲1024字節
  • [x] -t 255:設置發送數據包的ttl值爲255

2.5 nmap:網絡探測工具和安全/端口掃描器

2.5.1 命令詳解

功能說明:

nmap命令是一款開放源代碼的網絡探測和安全審覈工具,是Network Mapper的縮寫。其設計目標是快速地掃描大型網絡。nmap能夠發現網絡上有哪些主機,主機提供了什麼服務(應用程序名稱和版本號),並探測操做系統的類型及版本信息。
若是系統沒有nmap命令,則可使用下面的命令來安裝:
yum -y install nmap

選項說明:

參數選項 解釋說明(帶@的爲重點)
-sS TCP同步掃描(TCP SYN)@
-sT TCP鏈接掃描
-sn 不進行端口掃描,只檢查主機正在運行。該選項與老版本的-sP相同@
-sU 掃描UDP端口
-sV 探測服務版本信息
-Pn 只進行掃描,不ping主機
-PS 使用SYN包對目標主機進行掃描。默認是80端口,也能夠指定端口,格式爲-PS22或-PS22-25,80,113,1050,35000,記住PS和端口號之間不要有空格
-PU 使用udp ping掃描端口
-O 激活對TCP/IP指紋特徵(fingerprinting)的掃描,得到遠程主機的標誌,也就是操做系統類型
-v 顯示掃描過程當中的詳細信息@
-S 設置掃描的源IP地址
-g port 設置掃描的源端口
-oN 把掃描的結果重定向到文件中
-iL filename 從文件中讀取掃描的目標
-p <端口> 指定要掃描的端口,能夠是一個單獨的端口,也能夠用逗號分隔開多個端口,或者使用「-」表示端口範圍@
-n 不進行DNS解析,加快掃描速度@
-exclude 排除指定主機
-excludefile 排除指定文件中的主機

2.5.2 使用範例

(1)查看主機當前開放的端口

[root@Mr_chen ~]# nmap 192.168.0.1  #直接接目標主機,默認會掃描1~1000端口

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:23 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.014s latency).        #目標主機正在運行
Not shown: 999 closed ports         #999個端口關閉
PORT   STATE SERVICE
80/tcp open  http                   #開放的80端口http服務
MAC Address: CC:B2:55:DF:3C:83 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 0.37 seconds

(2)掃描主機的指定端口

[root@Mr_chen ~]# nmap -p 1024-65535 192.168.0.1    #-p選項指定掃描範圍

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:26 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.039s latency).
Not shown: 64511 closed ports
PORT     STATE SERVICE
1780/tcp open  unknown
MAC Address: CC:B2:55:DF:3C:83 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 17.46 seconds

(3)掃描局域網內全部的IP

[root@Mr_chen ~]# nmap 192.168.0.0/24   #使用網段的格式掃描局域網

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:29 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.0072s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
80/tcp open  http
MAC Address: CC:B2:55:DF:3C:83 (Unknown)

Nmap scan report for localhost (192.168.0.129)
Host is up (0.092s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
80/tcp open  http
MAC Address: F0:FE:6B:69:5B:1E (Unknown)

Nmap scan report for localhost (192.168.0.133)
Host is up (0.33s latency).
All 1000 scanned ports on localhost (192.168.0.133) are closed
MAC Address: BC:3D:85:FE:3F:DA (Unknown)

Nmap scan report for localhost (192.168.0.233)
Host is up (0.0000010s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for localhost (192.168.0.254)
Host is up (0.00016s latency).
Not shown: 992 closed ports
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
443/tcp   open  https
445/tcp   open  microsoft-ds
902/tcp   open  iss-realsecure
912/tcp   open  apex-mesh
5678/tcp  open  rrac
10000/tcp open  snet-sensor-mgmt
MAC Address: 30:B4:9E:74:1B:3B (Unknown)

Nmap done: 256 IP addresses (5 hosts up) scanned in 19.27 seconds

[root@Mr_chen ~]# nmap -sn 192.168.0.0/24   #使用-sn選項不掃描端口

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:32 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.0027s latency).
MAC Address: CC:B2:55:DF:3C:83 (Unknown)
Nmap scan report for localhost (192.168.0.233)
Host is up.
Nmap scan report for localhost (192.168.0.254)
Host is up (0.000071s latency).
MAC Address: 30:B4:9E:74:1B:3B (Unknown)
Nmap done: 256 IP addresses (3 hosts up) scanned in 2.56 seconds

[root@Mr_chen ~]# nmap -sn 192.168.0.232-234    #使用這種地址範圍進行掃描

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:34 EST
Nmap scan report for localhost (192.168.0.233)
Host is up.
Nmap done: 3 IP addresses (1 host up) scanned in 0.81 seconds

(4)探測目標主機的服務和操做系統的版本

[root@Mr_chen ~]# nmap -O -sV 192.168.0.1

Starting Nmap 5.51 ( http://nmap.org ) at 2018-02-28 08:43 EST
Nmap scan report for localhost (192.168.0.1)
Host is up (0.0037s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Linksys wireless-G WAP http config (Name D-Link Wireless N Router DIR-600M)
MAC Address: CC:B2:55:DF:3C:83 (Unknown)
Device type: general purpose
Running: Linux 2.4.X
OS details: Linux 2.4.18 - 2.4.35 (likely embedded)
Network Distance: 1 hop
Service Info: Device: WAP

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 2.93 seconds

上邊的輸出信息中不只包含了端口號,並且還包括了服務的版本號。在網絡安全性要求較高的主機上,最好可以屏蔽服務版本號,以防止黑客利用特定版本的服務漏洞進行攻擊。

2.6 tcpdump:監聽網絡流量

2.6.1 命令詳解

功能說明:

  • tcpdump命令是一個截獲網絡數據包的包分析工具。tcpdump能夠將網絡中傳送的數據包的「頭」徹底截獲下來以提供分析。它支持針對網絡層,協議,主機,端口等的過濾,並支持與,或,非邏輯語句協助過濾有效信息。
  • tcpdump命令工做時要先把網卡的工做模式切換到混雜模式(promiscuous mode)。由於要修改網絡接口的工做模式,因此tcpdump命令須要以root的身份運行。

選項說明:

參數選項 解釋說明(帶@的爲重點)
-A 以ASCII碼的方式顯示每個數據包(不會顯示數據包中鏈路層的頭部信息)。在抓取包含網頁數據的數據包時,可方便查看數據
-c <數據包數目> 接收到指定的數據包數目後退出命令@
-e 每行的打印輸出中將包含數據包的數據鏈路層頭部信息
-i <網絡接口> 指定要監聽數據包的網絡接口@
-n 不進行DNS解析,加快顯示速度@
-nn 不將協議和端口數字等轉換成名字@
-q 以快速輸出的方式運行,此選項僅顯示數據包的協議概要信息,輸出信息較短@
-s <數據包大小> 設置數據包抓取長度,若是不設置則默認爲68字節,設置爲0則自動選擇合適的長度來抓取數據包
-t 在每行輸出信息中不顯示時間戳標記
-tt 在每行輸出信息中顯示無格式的時間戳標記
-ttt 顯示當前行與前一行的延遲
-tttt 在每行打印的時間戳以前添加日期
-ttttt 顯示當前行與第一行的延遲
-v 顯示命令執行的詳細信息
-vv 顯示比-v選項更加詳細的信息
-vvv 顯示比-vv選項更加詳細的輸出

2.6.2 使用範例

(1)不加參數運行tcpdump命令監聽網絡

[root@localhost ~]# tcpdump #默認狀況下,直接啓動tcpdump將監視第一個網絡接口上全部流過的數據包
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:12:45.464963 IP localhost.ssh > localhost.50832: Flags [P.], seq 898292388:898292596, ack 861396487, win 317, length 208
05:12:45.465055 IP localhost.50832 > localhost.ssh: Flags [.], ack 208, win 523, length 0
05:12:45.465215 IP localhost.57595 > localhost.domain: 4104+ PTR? 254.0.168.192.in-addr.arpa. (44)
05:12:45.467851 IP localhost.domain > localhost.57595: 4104 1/0/0 PTR localhost. (67)
05:12:45.467906 IP localhost.57067 > localhost.domain: 107+ PTR? 233.0.168.192.in-addr.arpa. (44)
05:12:45.469444 IP localhost.domain > localhost.57067: 107 1/0/0 PTR localhost. (67)
05:12:45.469504 IP localhost.34192 > localhost.domain: 2703+ PTR? 1.0.168.192.in-addr.arpa. (42)
05:12:45.621206 IP localhost.ssh > localhost.50832: Flags [P.], seq 3120:3280, ack 1, win 317, length 160
05:12:45.621258 IP localhost.50832 > localhost.ssh: Flags [.], ack 3280, win 524, length 0
05:12:45.636742 IP localhost.ssh > localhost.50832: Flags [P.], seq 3280:3536, ack 1, win 317, length 256
05:12:45.643843 IP localhost.50832 > localhost.ssh: Flags [P.], seq 1:65, ack 3536, win 523, length 64
05:12:45.643889 IP localhost.ssh > localhost.50832: Flags [P.], seq 3536:3696, ack 65, win 317, length 160
^C              #tcpdump命令在運行期間可使用組合Ctrl+C終止程序
29 packets captured     #最後三行就是按CTRL+C後輸出的監聽到的數據包彙總信息
32 packets received by filter
0 packets dropped by kernel

使用tcpdump命令時,若是不輸入過濾規則,則輸出的數據量將會很大。

(2)精簡輸出信息

[root@localhost ~]# tcpdump -q  #默認狀況下,tcpdump命令的輸出信息較多,爲了顯示精簡的信息,可使用-q選項
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:33:01.438200 IP localhost.ssh > localhost.50832: tcp 208
05:33:01.479036 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.494539 IP localhost.ssh > localhost.50832: tcp 176
05:33:01.510460 IP localhost.ssh > localhost.50832: tcp 112
05:33:01.510907 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.525789 IP localhost.ssh > localhost.50832: tcp 176
05:33:01.541450 IP localhost.ssh > localhost.50832: tcp 112
05:33:01.541548 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.557049 IP localhost.ssh > localhost.50832: tcp 176
05:33:01.574173 IP localhost.ssh > localhost.50832: tcp 112
05:33:01.574486 IP localhost.50832 > localhost.ssh: tcp 0
05:33:01.583765 IP localhost.50832 > localhost.ssh: tcp 64
05:33:01.583857 IP localhost.ssh > localhost.50832: tcp 176
^C
24 packets captured
26 packets received by filter
0 packets dropped by kernel
[root@localhost ~]# tcpdump -c 5    #使用-c選項指定監聽的數據包數量,這樣就不須要使用Ctrl+Ctcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:34:24.515192 IP localhost.ssh > localhost.50832: Flags [P.], seq 898300004:898300212, ack 861398503, win 317, length 208
05:34:24.515301 IP localhost.50832 > localhost.ssh: Flags [.], ack 208, win 519, length 0
05:34:24.515445 IP localhost.60389 > localhost.domain: 26412+ PTR? 254.0.168.192.in-addr.arpa. (44)
05:34:24.518180 IP localhost.domain > localhost.60389: 26412 1/0/0 PTR localhost. (67)
05:34:24.518247 IP localhost.38804 > localhost.domain: 7473+ PTR? 233.0.168.192.in-addr.arpa. (44)
5 packets captured
10 packets received by filter
0 packets dropped by kernel

(3)監聽指定網卡收到的數據包

[root@Mr_chen ~]# tcpdump -i eth0   #使用-i選項能夠指定要監聽的網卡
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
05:46:06.865643 IP localhost.ssh > localhost.50832: Flags [P.], seq 898335828:898336036, ack 861403175, win 317, length 208
05:46:06.865721 IP localhost.50832 > localhost.ssh: Flags [.], ack 208, win 524, length 0
05:46:06.865876 IP localhost.37090 > localhost.domain: 16313+ PTR? 254.0.168.192.in-addr.arpa. (44)
^C
49 packets captured
52 packets received by filter
0 packets dropped by kernel

如下是命令的結果說明

  • [x] 05:46:06.865643:當前時間,精確到微妙
  • [x] IP localhost.ssh > localhost.50832:從主機localhost的SSH端口發送數據到localhost的50832端口,「>」表明數據流向
  • [x] Flags [P.]:TCP包中的標誌信息,S是SYN標誌的縮寫,F(FIN),P(PUSH),R(RST),「.」(沒有標記)。
  • [x] seq:數據包中的數據的順序號。
  • [x] ack:下次指望的順序號
  • [x] win:接收緩存的窗口大小
  • [x] length:數據包長度

(4)監聽指定主機的數據包

[root@Mr_chen ~]# tcpdump -n -c 5 host 192.168.0.254    #使用-n選項不進行DNS解析,加快顯示速度。監聽指定主機的關鍵字爲host,後面直接接主機名或IP地址便可。本行命令的做用是監聽全部192.168.0.254的主機收到的和發出的數據包
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
06:18:59.812585 IP 192.168.0.233.ssh > 192.168.0.254.50832: Flags [P.], seq 898389300:898389508, ack 861410071, win 317, length 208
06:18:59.812763 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 208, win 524, length 0
06:18:59.813478 IP 192.168.0.233.ssh > 192.168.0.254.50832: Flags [P.], seq 208:496, ack 1, win 317, length 288
06:18:59.814441 IP 192.168.0.233.ssh > 192.168.0.254.50832: Flags [P.], seq 496:672, ack 1, win 317, length 176
06:18:59.814534 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 672, win 522, length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
[root@Mr_chen ~]# tcpdump -n -c 5 src host 192.168.0.254    #只監遵從192.168.0.254發出的數據包,即源地址爲192.168.0.254,關鍵字爲srcsource,源地址)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
06:19:45.439633 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 898393156, win 522, length 0
06:19:45.511489 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 161, win 521, length 0
06:19:45.589521 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 321, win 520, length 0
06:19:45.667712 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 481, win 520, length 0
06:19:45.733979 IP 192.168.0.254.50832 > 192.168.0.233.ssh: Flags [.], ack 641, win 519, length 0
5 packets captured
6 packets received by filter
0 packets dropped by kernel
[root@Mr_chen ~]# tcpdump -n -c 5 dst host 192.168.0.254    #只監聽192.168.0.254收到的數據包,即目標地址爲192.168.0.254,關鍵字爲dstdestination,目的地)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:21:33.783811 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 1885784800:1885785008, ack 322191067, win 317, length 208
18:21:33.785709 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 208:400, ack 1, win 317, length 192
18:21:33.786677 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 400:576, ack 1, win 317, length 176
18:21:33.787676 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 576:752, ack 1, win 317, length 176
18:21:33.788684 IP 192.168.0.233.ssh > 192.168.0.254.55962: Flags [P.], seq 752:928, ack 1, win 317, length 176
5 packets captured
5 packets received by filter
0 packets dropped by kernel

(5)監聽指定端口的數據包

[root@Mr_chen ~]# tcpdump -nn -c 5 port 22  #-nn不進行DNS解析,不將端口轉換成服務名字, port指定監聽端口
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:27:25.472624 IP 192.168.0.233.22 > 192.168.0.254.55962: Flags [P.], seq 1886385856:1886386064, ack 322195131, win 317, length 208
18:27:25.472764 IP 192.168.0.254.55962 > 192.168.0.233.22: Flags [.], ack 208, win 522, length 0
18:27:25.473731 IP 192.168.0.233.22 > 192.168.0.254.55962: Flags [P.], seq 208:496, ack 1, win 317, length 288
18:27:25.474746 IP 192.168.0.233.22 > 192.168.0.254.55962: Flags [P.], seq 496:672, ack 1, win 317, length 176
18:27:25.474836 IP 192.168.0.254.55962 > 192.168.0.233.22: Flags [.], ack 672, win 520, length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

(6)監聽指定協議的數據包

[root@Mr_chen ~]# tcpdump -n -c 5 arp   #監聽arp協議數據包,所以表達式直接寫arp便可
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:29:08.056959 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:08.978765 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:09.900334 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:10.822093 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
18:29:12.050836 ARP, Request who-has 192.168.0.111 tell 192.168.0.1, length 46
5 packets captured
5 packets received by filter
0 packets dropped by kernel
[root@Mr_chen ~]# tcpdump -n -c 5 icmp  #監聽icmp數據包(想要查看下面的監控數據,可使用其餘機器ping本機便可)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:30:55.576828 IP 192.168.0.254 > 192.168.0.233: ICMP echo request, id 1, seq 19956, length 40
18:30:55.576844 IP 192.168.0.233 > 192.168.0.254: ICMP echo reply, id 1, seq 19956, length 40
18:30:56.578427 IP 192.168.0.254 > 192.168.0.233: ICMP echo request, id 1, seq 19958, length 40
18:30:56.578445 IP 192.168.0.233 > 192.168.0.254: ICMP echo reply, id 1, seq 19958, length 40
18:30:57.582167 IP 192.168.0.254 > 192.168.0.233: ICMP echo request, id 1, seq 19960, length 40
5 packets captured
6 packets received by filter
0 packets dropped by kernel

常見的協議關鍵字有ip,arp,icmp,tcp,udp等類型

(7)利用tcpdump抓包詳解tcp/ip鏈接和斷開過程的案例

1)正常的TCP鏈接的三個階段

  • [x] :TCP三次握手
  • [x] :數據傳送
  • [x] :TCP四次斷開

2)TCP鏈接圖示

TCP鏈接的狀態機制以下圖所示

QQ截圖20180303114730.png-137.5kB

3)TCP的狀態標識

  • [x] SYN:(同步序列編號,Synchronize Sequence Numbers)該標誌僅在三次握手創建TCP鏈接時有效。表示一個新的TCP鏈接請求
  • [x] ACK:(確認編號,Acknowledgement Number)是對TCP請求的確認標誌,同時提示對端系統已經成功接收了全部的數據。
  • [x] FIN:(結束標誌,FINish)用來結束一個TCP回話。但對應端口仍然處於開放狀態,準備接收後續數據。

4)使用tcpdump對tcp數據進行抓包

[root@Mr_chen www]# tcpdump tcp port 80 or dst 192.168.0.114 -i eth0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
#抓包分析:三次握手過程
22:38:18.564320 ARP, Reply 192.168.0.233 is-at 00:0c:29:a8:ca:50, length 28 
#發送了一個ARP響應包給目標MAC地址,告知對方本機的MAC地址
22:38:18.564418 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [S], seq 3675775834, win 14600, options [mss 1460,sackOK,TS val 4294710555 ecr 0,nop,wscale 6], length 0 
#IP爲192.168.0.114(client)經過臨時端口52367向本機192.168.0.233(server)的80監聽端口發起鏈接,client的初始包序號爲3675775834,滑動窗口大小爲14600字節(即TCP接收緩衝區的大小,用於TCP擁塞控制),mss大小爲1460(便可接收的最大包長度),[S]=[SYN](發起鏈接標誌)
22:38:18.564434 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [S.], seq 2909831439, ack 3675775835, win 14480, options [mss 1460,sackOK,TS val 15157720 ecr 4294710555,nop,wscale 6], length 0
#Server的響應鏈接,同時帶上上一個包的ack信息(爲client端的初始包序號+1,即3675775835,也就是server端下次等待接收這個包序號的包,用於TCP字節流的順序控制。Server端的初始包序號爲2909831439,mss也是146022:38:18.564541 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 4294710556 ecr 15157720], length 0
#Client端再次確認,tcp三次握手完成。「.」表示沒有任何標識

如下是數據傳輸過程:

22:38:18.564654 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [P.], seq 1:169, ack 1, win 229, options [nop,nop,TS val 4294710557 ecr 15157720], length 168
#Client端發請求包,包長度是168字節。[P]=[push](傳送數據標誌)
22:38:18.564658 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [.], ack 169, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 0  #Server端迴應Client端表示收到請求,並確認已經收到了以前的168字節
22:38:18.564707 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [P.], seq 1:237, ack 169, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 236    #Server回包,包長度236字節
22:38:18.564755 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [P.], seq 237:258, ack 169, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 21
22:38:18.564773 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 237, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0
22:38:18.564818 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 258, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0

如下是4次揮手過程:

22:38:18.564946 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [F.], seq 169, ack 258, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0  
#Client端發送關閉鏈接請求,F=FIN(斷開鏈接標誌)
22:38:18.564956 IP 192.168.0.233.http > 192.168.0.114.52367: Flags [F.], seq 258, ack 170, win 243, options [nop,nop,TS val 15157720 ecr 4294710557], length 0
#Server端迴應並確認了Client端的斷開鏈接請求,而且也發送了FIN標誌關閉。(只有當服務器傳輸未完成時,此處纔會出現兩次揮手,若是Clinet發起斷開請求時,服務器已經傳輸數據完成,則此處服務端會直接回應關閉標誌FIN)
22:38:18.565022 IP 192.168.0.114.52367 > 192.168.0.233.http: Flags [.], ack 259, win 245, options [nop,nop,TS val 4294710557 ecr 15157720], length 0
#Clinet端響應ack,關閉鏈接的四次揮手完成

提示:
tcpdump是一個很是強大而且好用的命令,請同窗們多花精力來掌握,固然,要想掌握好,還須要必定的網絡知識才行

三,Linux核心系統管理命令

3.1 lsof:查看進程打開的文件

3.1.1 命令詳解

功能說明:

lsof全名爲list open files,也就是列舉系統中已經被打開的文件,經過lsof命令,就能夠根據文件找到對應的進程信息,也能夠根據進程信息找到進程打開的文件

選項說明:

參數選項 解釋說明
-c <進程名> 顯示指定的進程名所打開的文件
-p <進程號> 顯示指定的進程號所打開的文件
-i 經過監聽指定的協議,端口和主機等信息,顯示符合條件的進程信息
-u 顯示指定用戶使用的文件
-U 顯示全部socket文件

3.1.2 使用範例

(1)顯示使用文件的進程

[root@Mr_chen ~]# lsof /var/log/messages    #顯示使用文件的進程
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 870 root    1w   REG  253,0   501224 262654 /var/log/messages

若是想知道某個特定的文件是由哪一個進程在使用,就能夠經過「lsof 文件名」的方式來獲得。從上面的輸出能夠得知,/var/log/messages文件是由rsyslogd進程在使用。
輸出中每列的含義具體以下:

  • [x] COMMAND:命令,進程的名稱。
  • [x] PID:進程號。
  • [x] USER:進程的全部者。
  • [x] FD:文件描述符,它又包含以下內容
    • 0:表示標準輸出。
    • 1:表示標準輸入。
    • 2:表示標準錯誤。
    • u:表示該文件被打開並處於讀取/寫入模式
    • r:表示該文件被打開並處於只讀模式
    • w:表示該文件被打開並處於寫入模式
  • [x] TYPE:文件類型,REG(regular)爲普通文件
  • [x] DEVICE:指定磁盤的名稱。
  • [x] SIZE/OFF:文件的大小
  • [x] NODE:索引節點
  • [x] NAME:文件名稱

(2)顯示指定進程所打開的文件

[root@Mr_chen ~]# lsof -c rsyslog #使用-c選項顯示指定進程所打開的文件
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
rsyslogd 870 root  cwd    DIR              253,0     4096          2 /
rsyslogd 870 root  rtd    DIR              253,0     4096          2 /
rsyslogd 870 root  txt    REG              253,0   396064     130951 /sbin/rsyslogd
rsyslogd 870 root  mem    REG              253,0    27232     393534 /lib64/rsyslog/imklog.so
rsyslogd 870 root  mem    REG              253,0   340568     393540 /lib64/rsyslog/imuxsock.so
rsyslogd 870 root  mem    REG              253,0    65928     392495 /lib64/libnss_files-2.12.so
rsyslogd 870 root  mem    REG              253,0    26984     393541 /lib64/rsyslog/lmnet.so
rsyslogd 870 root  mem    REG              253,0  1921216     392479 /lib64/libc-2.12.so
rsyslogd 870 root  mem    REG              253,0    90880     392452 /lib64/libgcc_s-4.4.7-20120601.so.1
rsyslogd 870 root  mem    REG              253,0    43832     392507 /lib64/librt-2.12.so
rsyslogd 870 root  mem    REG              253,0    19536     392485 /lib64/libdl-2.12.so
rsyslogd 870 root  mem    REG              253,0   142640     392503 /lib64/libpthread-2.12.so
rsyslogd 870 root  mem    REG              253,0    88600     392529 /lib64/libz.so.1.2.3
rsyslogd 870 root  mem    REG              253,0   154520     392472 /lib64/ld-2.12.so
rsyslogd 870 root    0u  unix 0xffff880037d8b6c0      0t0       8910 /dev/log
rsyslogd 870 root    1w   REG              253,0   501224     262654 /var/log/messages
rsyslogd 870 root    2w   REG              253,0     5164     262655 /var/log/secure
rsyslogd 870 root    3r   REG                0,3        0 4026532040 /proc/kmsg
rsyslogd 870 root    4w   REG              253,0    18512     262652 /var/log/cron

(3)顯示指定進程號說打開的文件

[root@Mr_chen ~]# lsof -p 870 #使用-p選項顯示指定進程號所打開的文件
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
rsyslogd 870 root  cwd    DIR              253,0     4096          2 /
rsyslogd 870 root  rtd    DIR              253,0     4096          2 /
rsyslogd 870 root  txt    REG              253,0   396064     130951 /sbin/rsyslogd
rsyslogd 870 root  mem    REG              253,0    27232     393534 /lib64/rsyslog/imklog.so
rsyslogd 870 root  mem    REG              253,0   340568     393540 /lib64/rsyslog/imuxsock.so
rsyslogd 870 root  mem    REG              253,0    65928     392495 /lib64/libnss_files-2.12.so
rsyslogd 870 root  mem    REG              253,0    26984     393541 /lib64/rsyslog/lmnet.so
rsyslogd 870 root  mem    REG              253,0  1921216     392479 /lib64/libc-2.12.so
rsyslogd 870 root  mem    REG              253,0    90880     392452 /lib64/libgcc_s-4.4.7-20120601.so.1
rsyslogd 870 root  mem    REG              253,0    43832     392507 /lib64/librt-2.12.so
rsyslogd 870 root  mem    REG              253,0    19536     392485 /lib64/libdl-2.12.so
rsyslogd 870 root  mem    REG              253,0   142640     392503 /lib64/libpthread-2.12.so
rsyslogd 870 root  mem    REG              253,0    88600     392529 /lib64/libz.so.1.2.3
rsyslogd 870 root  mem    REG              253,0   154520     392472 /lib64/ld-2.12.so
rsyslogd 870 root    0u  unix 0xffff880037d8b6c0      0t0       8910 /dev/log
rsyslogd 870 root    1w   REG              253,0   501224     262654 /var/log/messages
rsyslogd 870 root    2w   REG              253,0     5164     262655 /var/log/secure
rsyslogd 870 root    3r   REG                0,3        0 4026532040 /proc/kmsg
rsyslogd 870 root    4w   REG              253,0    18512     262652 /var/log/cron

(4)監聽指定的協議,端口和主機等信息,顯示符合條件的進程信息

在講解範例以前,咱們先來看看相應語法格式:
lsof -i [46] [protocol] [@hostname] [:service|port]
其中各項的含義以下:

  • [x] 46:4表明IPv4,6表明IPv6
  • [x] protocol:傳輸協議,能夠是TCP或UDP
  • [x] hostname:主機名稱或者IP地址
  • [x] service:進程的服務名,例如NFS,SSH和FTP等。
  • [x] port:系統中與服務對應的端口號。例如HTTP服務默認對應的端口號爲80,SSH服務默認對應的端口號爲22.
[root@Mr_chen ~]# lsof -i   #查看全部進程
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)
[root@Mr_chen ~]# lsof -i tcp   #顯示全部tcp網絡鏈接的進程信息
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)
[root@Mr_chen ~]# lsof -i:22    #顯示端口爲22的進程,這條命令很經常使用
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)
[root@Mr_chen ~]# lsof -i tcp:22    #顯示同時知足TCP和端口爲22的進程
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    885 root    3u  IPv4   8948      0t0  TCP *:ssh (LISTEN)
sshd    885 root    4u  IPv6   8950      0t0  TCP *:ssh (LISTEN)
sshd    918 root    3r  IPv4   9075      0t0  TCP localhost:ssh->localhost:54216 (ESTABLISHED)

(5)顯示指定用戶使用的文件

[root@Mr_chen ~]# lsof -u Mr_chen   #使用-u選項顯示Mr_chen用戶使用的文件
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1012 Mr_chen  cwd    DIR  253,0     4096 138686 /home/Mr_chen
bash    1012 Mr_chen  rtd    DIR  253,0     4096      2 /
bash    1012 Mr_chen  txt    REG  253,0   903336 786016 /bin/bash
bash    1012 Mr_chen  mem    REG  253,0 99158576 655748 /usr/lib/locale/locale-archive
bash    1012 Mr_chen  mem    REG  253,0    65928 392495 /lib64/libnss_files-2.12.so
bash    1012 Mr_chen  mem    REG  253,0  1921216 392479 /lib64/libc-2.12.so
bash    1012 Mr_chen  mem    REG  253,0    19536 392485 /lib64/libdl-2.12.so
bash    1012 Mr_chen  mem    REG  253,0   135896 392521 /lib64/libtinfo.so.5.7
bash    1012 Mr_chen  mem    REG  253,0   154520 392472 /lib64/ld-2.12.so
bash    1012 Mr_chen  mem    REG  253,0    26060 916570 /usr/lib64/gconv/gconv-modules.cache
bash    1012 Mr_chen    0u   CHR  136,1      0t0      4 /dev/pts/1
bash    1012 Mr_chen    1u   CHR  136,1      0t0      4 /dev/pts/1
bash    1012 Mr_chen    2u   CHR  136,1      0t0      4 /dev/pts/1
bash    1012 Mr_chen  255u   CHR  136,1      0t0      4 /dev/pts/1

(6)顯示全部socket文件

[root@Mr_chen ~]# lsof -U #使用-U選項顯示全部socket文件
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
init        1 root    7u  unix 0xffff880037afa680      0t0  7510 socket
udevd     360 root    4u  unix 0xffff880037afa980      0t0  7857 socket
udevd     360 root    8u  unix 0xffff880037afac80      0t0  7873 socket
udevd     360 root    9u  unix 0xffff880037afa080      0t0  7874 socket
udevd     635 root    9u  unix 0xffff880037afa080      0t0  7874 socket
rsyslogd  870 root    0u  unix 0xffff880037d8b6c0      0t0  8910 /dev/log
crond     893 root    4u  unix 0xffff880037d8b3c0      0t0  8976 socket
sshd      918 root    4w  unix 0xffff880037d8b0c0      0t0  9125 socket
anacron   983 root    4u  unix 0xffff880037d8b9c0      0t0 10018 socket
su       1011 root    3u  unix 0xffff880037d8bcc0      0t0 10151 socket

3.2 free:查看系統內存信息

3.2.1 命令詳解

功能說明:

free命令用於顯示系統內存狀態,具體包括系統物理內存,虛擬內存,共享內存和系統緩存等。

選項說明:

參數選項 解釋說明(帶@的爲重點)
-b 以Byte爲單位顯示內存的使用狀況
-m 以MB爲單位顯示內存的使用狀況@
-K 以KB爲單位顯示內存的使用狀況
-h 以人類可讀的形式顯示內存的使用狀況@
-t 顯示內存總和列
-s <間隔秒數> 根據指定的間隔秒數持續顯示內存的使用狀況@
-o 不顯示系統緩衝區列

3.2.2 使用範例

(1)查看系統內存

[root@Mr_chen ~]# free #不加參數默認顯示的是字節數,很難讀懂
             total       used       free     shared    buffers     cached
Mem:       1004412      85788     918624          0       6168      22904
-/+ buffers/cache:      56716     947696
Swap:      2031608          0    2031608
[root@Mr_chen ~]# free -m #使用-m選項,以MB爲單位顯示內存的使用狀況
             total       used       free     shared    buffers     cached
Mem:           980         83        897          0          6         22
-/+ buffers/cache:         55        925
Swap:         1983          0       1983

針對上面的輸出,有如下說明

  • [x] Linux系統的特性是將不用的物理內存緩存起來,所以897MB不是系統的真實剩餘內存。
  • [x] 系統真正可用的內存爲925MB
  • [x] buffers爲寫入數據緩衝區
  • [x] cache爲讀取數據緩存區

(2)定時查詢內存

[root@Mr_chen ~]# free -s 10 #使用-s選項定時刷新內存的使用狀況,單位爲秒
             total       used       free     shared    buffers     cached
Mem:       1004412      85888     918524          0       6168      22932
-/+ buffers/cache:      56788     947624
Swap:      2031608          0    2031608

3.3 iftop:動態顯示網絡接口流量信息

3.3.1 命令詳解

功能說明:

  • iftop是一款實時流量監控工具,可用於監控TCP/IP鏈接等,必須以root用戶的身份運行。
  • 通常最小化安裝系統都是沒有這個命令的,須要使用yum命令額外安裝,並且還要從epel源下載。
    epel源的安裝幫助請參見:http://mirrors.aliyun.com/help/epel
    安裝iftop命令的步驟請參見:
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    yum -y install iftop

選項說明:

參數選項 解釋說明(帶@的爲重點)
-i 指定監聽的網絡接口@
-n 不進行DNS解析@
-N 不將端口號解析成服務名@
-B 以byte爲單位顯示流量(默認是bit)@
-p 設置網卡爲混雜模式,以便不直接經過指定接口傳遞的流量也能被計數
-P(大寫) 顯示端口號@
-m 設置界面最上邊的刻度的最大值,刻度分爲五個大段顯示
-F 顯示特定網段的進出流量

3.3.2 使用範例

(1)不接任何參數啓動iftop命令監控流量。

[root@Mr_chen yum.repos.d]# iftop
interface: eth0 #默認監聽系統的第一塊網卡,可使用-i選項指定監聽網卡
IP address is: 192.168.0.233
MAC address is: 00:0c:29:a8:ca:50

QQ截圖20180306231637.png-16.2kB

上圖爲iftop界面,相關說明以下:

  • [x] 界面上顯示的是相似刻度尺的刻度範圍,是以標尺的形式顯示流量圖形的長條
  • [x] 中間的<=或=>這兩個左右箭頭,表示的是流量的反向
  • [x] TX:發送流量
  • [x] RX:接收流量
  • [x] TOTAL:總流量
  • [x] Cum:運行iftop到目前時間的總流量
  • [x] peak:流量峯值
  • [x] rates:分別表示過去2s,10s,40s的平均流量

(2)經常使用命令組合

[root@Mr_chen yum.repos.d]# iftop -nNBP
interface: eth0
IP address is: 192.168.0.233
MAC address is: 00:0c:29:a8:ca:50

QQ截圖20180306231637.png-17.2kB

命令說明具體以下:

  • [x] -n:不進行DNS解析,顯示IP數字地址
  • [x] -N:顯示數字形式的端口號
  • [x] -P:顯示端口號
  • [x] -B:默認是以bit爲單位顯示流量,須要通過計算才能符合咱們的認知,可是使用-B選項就會直接顯示以字節爲單位的流量。

3.4 vmstat:虛擬內存統計

3.4.1 命令詳解

功能說明:

vmstat是Virtual Memory Statistics(虛擬內存統計)的縮寫,利用vmstat命令能夠對操做系統的內存信息,進程狀態和CPU活動等進行監視。可是隻能對系統的總體狀況進行統計,沒法對某個進程進行深刻分析。

選項說明:

參數選項 解釋說明(帶@的爲重點)
-a 顯示活躍和非活躍內存
-f 顯示從系統啓動至今的fork進程數量
-m 顯示slab信息
-n 只在開始時顯示一次各字段名稱
-s 顯示內存相關統計信息及多種系統活動數量@
-d 顯示磁盤相關統計信息
-p 顯示指定磁盤分區統計信息
-S 使用指定單位顯示。參數有k,K,m,M,分別表明1000,1024,1000000,1048576字節(byte)。默認單位爲K(1024byte)
-t 統計信息帶上時間戳

3.4.2 使用範例

(1)顯示虛擬內存的使用狀況

[root@Mr_chen ~]# vmstat #若是省略「間隔時間」和「次數」的參數,則僅顯示一次報告後就退出
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 915796   8792  22900    0    0  1188    54  203  474  2  6 90  1  0
 [root@Mr_chen ~]# vmstat 5 #表示每5秒鐘更新一次輸出信息,循環輸出,按Ctrl + C組合鍵中止輸出
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 915796   8792  22928    0    0   343    24   64  144  1  2 97  0  0    
[root@Mr_chen ~]# vmstat 5 6 #表示每5秒鐘更新一次輸出信息,統計6次後中止輸出
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 915796   8792  22928    0    0   781    53  137  316  1  4 94  1  0

如下是命令結果的詳解說明
第1列:procs

  • [x] r列表示運行和等待CPU時間片的進程數。
  • [x] b列表示正在等待資源的進程數。

第2列:memory

  • [x] swpd列表示使用虛擬內存的大小。
  • [x] free列表示當前空閒的物理內存數量.
  • [x] buff列表示buffers的內存數量.
  • [x] cache列表示cache的內存數量.

第3列:swap

  • [x] si(swap in)列表示由磁盤調入內存,也就是內存進入內存交換區的數量。
  • [x] so(swap out)列表示由內存調入磁盤,也就是內存交換區進入內存的數量。

第4列:I/O項顯示磁盤讀寫情況

  • [x] bi列表示從塊設備讀入數據的總量(即讀磁盤)(塊/s)
  • [x] bo列表示寫入塊設備的數據總量(即寫磁盤))(塊/s)

第5列:system顯示採集間隔內發生的中斷數

  • [x] in列表示在某一時間間隔中觀測到的每秒設備中斷數。
  • [x] cs列表示每秒產生的上下文切換次數。

第6列:CPU項顯示了CPU的使用狀態

  • [x] us列顯示了用戶進程消耗的CPU時間百分比。
  • [x] sy列顯示了系統(內核)進程消耗的CPU時間百分比。
  • [x] id列顯示了CPU處在空閒狀態的時間百分比。
  • [x] wa列顯示了I/O等待所佔用的CPU時間百分比
  • [x] st列顯示了虛擬機佔用的CPU時間的百分比。

(2)顯示活躍和非活躍內存

[root@Mr_chen ~]# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 915324  19284  18180    0    0     5     0    6    9  0  0 100  0  0   
 0  0      0 915284  19284  18180    0    0     0     0   10    9  0  0 100  0  0   
 0  0      0 915284  19284  18180    0    0     0     0   10   10  0  0 100  0  0   
 0  0      0 915284  19284  18212    0    0     0     0    9   10  0  0 100  0  0   
 0  0      0 915284  19284  18212    0    0     0     0    9   11  0  0 100  0  0

使用-a選項顯示活躍和非活躍內存時,所顯示的內容除去增長了inact和active以外,其餘顯示內容與範例11-12相同。
memory列增長了inact和active兩列,其說明具體以下。

  • [x] inact:非活躍的內存大小(當使用-a選項時顯示)
  • [x] active:活躍的內存大小(當使用-a選項時顯示)

(3)查看內存使用的詳細信息

[root@Mr_chen ~]# vmstat -s
      1004412  total memory
        89096  used memory
        18196  active memory
        19268  inactive memory
       915316  free memory
         8816  buffer memory
        23244  swap cache
      2031608  total swap
            0  used swap
      2031608  free swap
......

這些信息分別來自於/proc/meminfo,/proc/stat和/proc/vmstat

(4)查看磁盤的讀/寫

[root@Mr_chen ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
loop0      0      0       0       0      0      0       0       0      0      0
loop1      0      0       0       0      0      0       0       0      0      0
loop2      0      0       0       0      0      0       0       0      0      0
loop3      0      0       0       0      0      0       0       0      0      0
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
loop4      0      0       0       0      0      0       0       0      0      0
loop5      0      0       0       0      0      0       0       0      0      0
loop6      0      0       0       0      0      0       0       0      0      0
loop7      0      0       0       0      0      0       0       0      0      0
sr0       33      0     264      47      0      0       0       0      0      0
sda     2144   1571   70016     659    411    452    6898     277      0      0
dm-0    2786      0   62426    1755    854      0    6832     583      0      0
dm-1     287      0    2296      35      0      0       0       0      0      0

這些信息主要來自於/proc/diskstats。其中的merged表示一次來自於合併的寫/讀請求,系統通常會把多個鏈接/鄰近的讀/寫請求合併到一塊兒來操做。

(5)查看/dev/sda1磁盤的讀寫統計信息

[root@Mr_chen ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                 431       3518          9         66

這些信息主要來自於/proc/diskstats。各列的說明具體以下

  • [x] reads:來自於該分區的讀的次數
  • [x] read sectors:來自於該分區的讀扇區的次數
  • [x] writes:來自於該分區的寫的次數
  • [x] requested writes:來自於該分區的寫請求次數。

3.5 mpstat:CPU信息統計

3.5.1 命令詳解

功能說明:

  • mpstat是Multiprocessor Statistics的縮寫,是一種實時系統監控工具。mpstat命令會輸出CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPU的系統裏,此命令不但能用來查看全部CPU的平均狀態信息,並且還可以用來查看特定CPU的信息。
    mpstat命令的最大特色是:能夠查看多核心CPU中每一個計算核心的統計數據,而相似命令vmstat只能查看系統總體的CPU狀況。

選項說明:

參數選項 解釋說明
-P 指定CPU編號,例如:-P 0表示第一個CPU,-P 1表示第二個CPU,-P ALL表示全部CPU

3.5.2 使用範例

(1)顯示CPU信息統計

[root@Mr_chen ~]# mpstat    #若是省略「時間間隔」和「次數」參數,則僅顯示一次報告後就退出
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

06:13:34 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
06:13:34 PM  all    0.01    0.00    0.06    0.01    0.00    0.00    0.00    0.00   99.93
[root@Mr_chen ~]# mpstat 5 6    #表示每5秒更新一次輸出信息,統計6次後中止輸出。
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

06:15:16 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
06:15:21 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:26 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:31 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:36 PM  all    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.80
06:15:41 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
06:15:46 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:     all    0.00    0.00    0.03    0.00    0.00    0.00    0.00    0.00   99.97

如下是命令結果的詳細說明
第1列:06:13:34 PM,表示當前時間
第2列:CPU,all表示全部CPU,0表示第一個CPU...
後面9列的含義分別以下:

  • [x] %usr:用戶進程消耗的CPU時間百分比。
  • [x] %nice:改變過優先級的進程佔用的CPU時間百分比
  • [x] %sys:系統(內核)進程消耗的CPU時間百分比
  • [x] %iowait:IO等待所佔用的CPU時間百分比
  • [x] %irq:硬中斷佔用的CPU時間百分比
  • [x] %soft:軟中斷佔用的CPU時間百分比
  • [x] %steal:虛擬機強制CPU等待的時間百分比
  • [x] %guest:虛擬機佔用CPU時間的百分比
  • [x] %idle:CPU處於空閒狀態的時間百分比

(2)顯示指定CPU信息的統計

[root@Mr_chen ~]# mpstat -P 0 #顯示第一個CPU信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

06:29:46 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
06:29:46 PM    0    0.01    0.00    0.05    0.01    0.00    0.00    0.00    0.00   99.93

3.6 iostat:I/O信息統計

3.6.1 命令詳解

功能說明:

iostat是I/O statistics(輸入/輸出統計)的縮寫,其主要功能是對系統的磁盤I/O操做進行監視。它的輸出主要是顯示磁盤讀寫操做的統計信息,同時也會給出CPU的使用狀況。同vmstat命令同樣,iostat命令也不能對某個進程進行深刻分析,僅會對系統的總體狀況進行分析。

選項說明:

參數選項 解釋說明(帶@爲重點)
-c 顯示CPU的使用狀況@
-d 顯示磁盤的使用狀況@
-k 每秒以kB爲單位顯示數據
-m 每秒以MB爲單位顯示數據
-n 顯示NFS的使用狀況
-t 顯示每次統計的執行時間
-p device 指定要統計的磁盤設備名稱,默認爲全部的磁盤設備
-x 顯示擴展統計

3.6.2 使用範例

(1)顯示全部設備的負載狀況

[root@Mr_chen ~]# iostat #若是省略「時間間隔」和「次數」參數,則僅顯示一次報告後就退出
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.02    0.00    0.05    0.01    0.00   99.93

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.02         0.13         0.00       1976          0
sda               0.34        28.21         7.76     445866     122724
dm-0              1.30        27.73         7.76     438306     122664
dm-1              0.02         0.15         0.00       2296          0

如下是命令結果說明
第1~2行中各列的含義具體以下

  • [x] %user : 用戶進程消耗的CPU時間百分比
  • [x] %nice : 改變過優先級的進程佔用的CPU時間百分比
  • [x] %system : 系統(內核)進程消耗的CPU時間百分比
  • [x] %iowait : IO等待所佔用的CPU時間百分比
  • [x] %steal : 虛擬機強制CPU等待的時間百分比
  • [x] %idle : CPU處在空閒狀態的時間百分比
    第3~4行中各列的含義以下

  • [x] tps : 表示該設備每秒的傳輸次數,「一次傳輸」的意思是「一次I/O請求」,多個邏輯請求可能會被合併爲「一次I/O請求」,「一次傳輸」請求的大小是未知的。
  • [x] Blk_read/s : 表示每秒讀取的數據塊數
  • [x] Blk_wrtn/s : 表示每秒寫入的數據塊數
  • [x] Blk_read : 表示讀取的全部塊數
  • [x] Blk_wrtn : 表示寫入的全部塊數

(2)定時顯示全部信息

[root@Mr_chen ~]# iostat 2 3 #每隔2秒刷新顯示一次,共顯示3次
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.04    0.00    0.00   99.94

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.02         0.09         0.00       1976          0
sda               0.25        19.82         5.51     445866     123988
dm-0              0.92        19.48         5.51     438306     123928
dm-1              0.01         0.10         0.00       2296          0

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
sda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.50    0.00    0.00   99.50

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
sda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0

(3)只顯示磁盤統計信息

[root@Mr_chen ~]# iostat -d #選項-d只顯示磁盤的統計信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.02         0.09         0.00       1976          0
sda               0.24        19.50         5.43     445866     124108
dm-0              0.91        19.17         5.42     438306     124048
dm-1              0.01         0.10         0.00       2296          0
[root@Mr_chen ~]# iostat -d -k  #選項-kKB爲單位顯示數據
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.02         0.04         0.00        988          0
sda               0.24         9.72         2.70     222933      62054
dm-0              0.91         9.55         2.70     219153      62024
dm-1              0.01         0.05         0.00       1148          0
[root@Mr_chen ~]# iostat -d -m  #選項-mMB爲單位顯示數據
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
scd0              0.02         0.00         0.00          0          0
sda               0.24         0.01         0.00        217         60
dm-0              0.90         0.01         0.00        214         60
dm-1              0.01         0.00         0.00          1          0

(4)查看擴展信息

[root@Mr_chen ~]# iostat -d -x -k #選項-x顯示擴展信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

Device:         rrqm/s wrqm/s     r/s w/s    rkB/s wkB/s avgrq-sz avgqu-sz   await  svctm  %util
scd0              0.00     0.00    0.02    0.00     0.04     0.00     5.41     0.00    1.09   1.09   0.00
sda               0.08     0.61    0.18    0.05     9.49     2.65   102.62     0.00    0.79   0.42   0.01
dm-0              0.00     0.00    0.22    0.66     9.33     2.65    27.03     0.01    6.17   0.11   0.01
dm-1              0.00     0.00    0.01    0.00     0.05     0.00     8.00     0.00    0.24   0.13   0.00

如下是命令結果說明

  • [x] rrqm/s:每秒進行merge的讀操做數目
  • [x] wrqm/s:每秒進行merge的寫操做數目
  • [x] r/s:每秒完成的讀I/O設備次數
  • [x] w/s:每秒完成的寫I/O設備次數
  • [x] rkB/s:每秒讀入的千字節數
  • [x] wkB/s:每秒寫入的千字節數
  • [x] avgrq-sz:設備平均每次進行I/O操做的數據大小(扇區)
  • [x] avgqu-sz:平均I/O隊列長度
  • [x] await:設備平均每次I/O操做的等待時間(毫秒)
  • [x] svctm:設備平均每次I/O操做的服務時間(毫秒)
  • [x] %util:每秒鐘用於I/O操做的百分比

(5)只查看CPU的統計信息

[root@Mr_chen ~]# iostat -c #使用-c選項只顯示系統CPU的統計信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.04    0.00    0.00   99.95

3.7 iotop:動態顯示磁盤I/O統計信息

3.7.1 命令詳解

功能說明:

iotop命令是一款實時監控磁盤I/O的工具,但必須以root用戶的身份運行。使用iotop命令能夠很方便地查看每一個進程使用磁盤I/O的狀況。
最小化安裝系統通常是沒有這個命令的,須要使用yum命令額外安裝,安裝命令以下:yum -y install iotop

選項說明:

參數選項 解釋說明(帶@爲重點)
-o 顯示正在使用I/O的進程或者線程,默認是顯示全部@
-d 設置顯示的間隔秒數
-p 只顯示指定PID的信息@
-u 顯示指定用戶的信息
-P(大寫) 只顯示進程,通常是顯示全部的線程
-a 顯示從iotop啓動後每一個線程完成了的I/O總數
-k 設置顯示單位爲KB
-t 在每一行前添加一個當前的時間

3.7.2 使用範例

(1)不接任何參數啓動iotop命令

[root@Mr_chen ~]# iotop     

Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                      
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kthreadd]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [migration/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [watchdog/0]
    7 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [events/0]
    8 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [cgroup]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [khelper]
   10 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [netns]
   11 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [async/mgr]
   12 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [pm]
   13 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [sync_supers]
   14 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [bdi-default]
   15 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kintegrityd/0]
   16 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kblockd/0]
   17 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kacpid]
   18 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kacpi_notify]
   19 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kacpi_hotplug]
   20 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [ata_aux]
   21 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [ata_sff/0]
   22 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [ksuspend_usbd]
   23 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [khubd]
   24 be/4 root        0.00 B/s    0.00 B/s  0.00 % 0.00 % [kseriod]

如下是命令結果的具體說明

  • [x] Total DISK READ:總的磁盤讀取速度
  • [x] Total DISK WRITE:總的磁盤寫入速度
  • [x] TID:進程pid值
  • [x] PRIO:優先級
  • [x] USER:用戶
  • [x] DISK READ:磁盤讀取速度
  • [x] DISK WRITE:磁盤寫入速度
  • [x] SWAPIN:從swap分區讀取數據佔用的百分比
  • [x] IO:I/O佔用的百分比
  • [x] COMMAND:消耗I/O的進程名

3.8 sar:收集系統信息

3.8.1 命令詳解

功能說明:

經過sar命令,能夠全面地獲取系統的CPU,運行隊列,磁盤I/O,分頁(交換區),內存,CPU中斷和網絡等性能數據

選項說明:

參數選項 解釋說明(帶@的爲重點)
-A 顯示系統全部資源設備(CPU,內存,磁盤)的運行狀態
-u 顯示系統全部CPU在採樣時間內的負載狀態@
-P 顯示當前系統中指定CPU的使用狀況
-d 顯示系統全部硬盤設備在採樣時間內的使用情況@
-r 顯示在採樣時間內系統內存的使用情況@
-b 顯示在採樣時間內緩衝區的使用狀況@
-v 顯示索引節點,文件和其餘內核表的狀態
-n 顯示網絡運行狀態@
-q 顯示運行隊列的大小,它與系統當時的平均負載相同@
-R 顯示進程在採樣時間內的活動狀況
-y 顯示終端設備在採樣時間內的活動狀況
-w 顯示系統交換活動在採樣時間內的狀態
-o filename 將命令結果以二進制格式存放在文件中,filename是文件名

3.8.2 使用範例

(1)查看系統CPU的總體負載狀況

[root@Mr_chen ~]# sar -u 2 3
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/10/2018  _x86_64_    (1 CPU)

11:44:34 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:44:36 PM     all      0.00      0.00      1.00      0.00      0.00     99.00
11:44:38 PM     all      0.00      0.00      0.50      0.00      0.00     99.50
11:44:40 PM     all      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.00      0.00      0.50      0.00      0.00     99.50

如下是命令結果的詳細說明

  • [x] %user:用戶進程消耗的CPU時間百分比
  • [x] %nice:改變過優先級的進程佔用的CPU時間百分比
  • [x] %system:系統(內核)進程消耗的CPU時間百分比
  • [x] %iowait:IO等待所佔用的CPU時間百分比
  • [x] steal:虛擬機強制CPU等待的時間百分比
  • [x] idle:CPU處在空閒狀態的時間百分比

(2)顯示運行隊列的大小

[root@localhost ~]# sar -q 2 3  #使用-q選項顯示運行隊列的大小
Linux 2.6.32-431.el6.x86_64 (localhost)     03/14/2018  _x86_64_    (1 CPU)

04:59:18 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
04:59:20 PM         0        69      0.00      0.00      0.00
04:59:22 PM         0        69      0.00      0.00      0.00
04:59:24 PM         0        70      0.00      0.00      0.00
Average:            0        69      0.00      0.00      0.00

如下是命令結果的詳解說明

  • [x] runq-sz:運行隊列的長度(等待運行的進程數)
  • [x] plist-sz:進程列表中進程(process)和線程(thread)的數量
  • [x] ldavg-1:最後一分鐘的系統平均負載(system load average)
  • [x] ldavg-5:過去5分鐘的系統平均負載
  • [x] ldavg-15:過去15分鐘的系統平均負載

(3)顯示系統內存的使用情況

[root@localhost ~]# sar -r 2 3  #使用-r選項顯示系統內存在採樣時間內的使用情況
Linux 2.6.32-431.el6.x86_64 (localhost)     03/14/2018  _x86_64_    (1 CPU)

05:03:44 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
05:03:46 PM    913012     91400      9.10     11136     23324     43344      1.43
05:03:48 PM    913012     91400      9.10     11136     23324     43344      1.43
05:03:50 PM    913012     91400      9.10     11136     23324     43344      1.43
Average:       913012     91400      9.10     11136     23324     43344      1.43

如下命令結果的詳細說明

  • [x] kbmemfree:空閒物理內存量
  • [x] kbmemused:使用中的物理內存量
  • [x] %memused:物理內存量的使用率
  • [x] kbbuffers:內核中做爲緩衝區使用的物理內存容量
  • [x] kbcached:內核中做爲緩存使用的物理內存容量
  • [x] kbcommit:應用程序當前使用的內存大小
  • [x] %commit:應用程序當前使用的內存大小佔總大小的使用百分比

(4)顯示緩衝區的使用狀況

[root@localhost ~]# sar -b 2 3  #使用-b選項顯示緩衝區在採樣時間內的使用狀況
Linux 2.6.32-431.el6.x86_64 (localhost)     03/14/2018  _x86_64_    (1 CPU)

05:15:01 PM       tps      rtps      wtps   bread/s   bwrtn/s
05:15:03 PM      0.00      0.00      0.00      0.00      0.00
05:15:05 PM      0.00      0.00      0.00      0.00      0.00
05:15:07 PM      0.00      0.00      0.00      0.00      0.00
Average:         0.00      0.00      0.00      0.00      0.00

如下是命令的詳細結果說明

  • [x] tps:每秒鐘物理設備的I/O傳輸總量
  • [x] rtps:每秒鐘從物理設備讀入的數據總量
  • [x] wtps:每秒鐘向物理設備寫入的數據總量
  • [x] bread/s:每秒鐘從物理設備讀入的數據量,單位爲塊/s
  • [x] bwrtn/s:每秒鐘向物理設備寫入的數據量,單位爲塊/s

(5)顯示網絡的運行狀態

咱們先來看一下顯示網絡接口信息的命令

[root@localhost ~]# sar -n DEV 2 3  #使用-n DEV顯示網絡接口的信息
Linux 2.6.32-431.el6.x86_64 (localhost)     03/14/2018  _x86_64_    (1 CPU)

05:22:13 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05:22:15 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:15 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:15 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:22:15 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05:22:17 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:17 PM      eth0      0.50      0.50      0.03      0.24      0.00      0.00      0.00
05:22:17 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:22:17 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
05:22:19 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:22:19 PM      eth0      0.50      0.50      0.03      0.24      0.00      0.00      0.00
05:22:19 PM      eth1      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:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth0      0.33      0.33      0.02      0.16      0.00      0.00      0.00
Average:         eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

如下是命令結果的詳細說明

  • [x] IFACE:網絡接口
  • [x] rxpck/s:每秒鐘接收的數據包
  • [x] txpck/s:每秒鐘發送的數據包
  • [x] rxkB/s:每秒鐘接收的字節數
  • [x] txkB/s:每秒鐘發送的字節數
  • [x] rxcmp/s:每秒鐘接收的壓縮數據包
  • [x] txcmp/s:每秒鐘發送的壓縮數據包
  • [x] rxmcst/s:每秒鐘接收的多播數據包

下面的命令用來顯示網絡錯誤的統計數據

[root@localhost ~]# sar -n EDEV 2 3 #使用-n EDEV顯示網絡錯誤的統計數據
Linux 2.6.32-431.el6.x86_64 (localhost)     03/14/2018  _x86_64_    (1 CPU)

05:32:03 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
05:32:05 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:05 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:05 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:32:05 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
05:32:07 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:07 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:07 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:32:07 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
05:32:09 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:09 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:32:09 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

如下是命令結果的詳細說明

  • [x] IFACE:網絡接口
  • [x] rxerr/s:每秒鐘接收的壞數據包
  • [x] txerr/s:每秒鐘發送的壞數據包
  • [x] coll/s:每秒的衝突數
  • [x] rxdrop/s:由於緩衝充滿,每秒鐘丟棄的已接收數據包數
  • [x] txdrop/s:由於緩衝充滿,每秒鐘丟棄的已發送數據包數
  • [x] txcarr/s:發送數據包時,每秒載波錯誤數
  • [x] rxfram/s:每秒接收數據包的幀對齊錯誤數
  • [x] rxfifo/s:接收的數據包每秒FIFO過速的錯誤數
  • [x] txfifo/s:發送的數據包每秒FIFO過速的錯誤數

下面的命令用於顯示套接字信息

[root@Mr_chen ~]# sar -n SOCK 2 3   #使用-n SOCK顯示套接字信息
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/14/2018  _x86_64_    (1 CPU)

05:42:12 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
05:42:14 PM       281         2         0         0         0         0
05:42:16 PM       281         2         0         0         0         0
05:42:18 PM       281         2         0         0         0         0
Average:          281         2         0         0         0         0

如下是命令結果的詳細說明

  • [x] totsck:使用的套接字總數量
  • [x] tcpsck:使用的TCP套接字數量
  • [x] udpsck:使用的UDP套接字數量
  • [x] rawsck:使用的raw套接字數量
  • [x] ip-frag:使用的IP段數量
  • [x] tcp-tw:處於TIME_WAIT狀態的TCP套接字數量

(6)查看系統磁盤的讀寫性能

[root@Mr_chen ~]# sar -d 2 3    #使用-d選項顯示系統全部硬盤設備在採樣時間內的使用情況
Linux 2.6.32-431.el6.x86_64 (Mr_chen)   03/14/2018  _x86_64_    (1 CPU)

05:47:59 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:48:01 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:01 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:01 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:01 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:48:01 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:48:03 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:03 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:03 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:03 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:48:03 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:48:05 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:05 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:05 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:48:05 PM  dev253-1      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:      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

如下是命令結果的詳細說明

  • [x] DEV:表示磁盤的設備名稱
  • [x] tps:表示該設備每秒的傳輸次數,「一次傳輸」的意思是「一次I/O請求」,多個邏輯請求可能會被合併爲「一次I/O請求」,「一次傳輸」請求的大小是未知的。
  • [x] rd_sec/s:表示每秒從設備讀取的扇區數
  • [x] wr_sec/s:表示每秒寫入設備的扇區數目
  • [x] avgrq-sz:設備平均每次I/O操做的數據大小(扇區)
  • [x] avgqu-sz:平均I/O隊列長度
  • [x] await:設備平均每次I/O操做的等待時間(毫秒)
  • [x] svctm:設備平均每次I/O操做的服務時間(毫秒)
  • [x] %util:每秒鐘用於I/O操做的百分比

四,Linux核心內置管理命令

4.1 佔位符「:」

(1)在Shell腳本中使用佔位符的例子

if [ $i -eq 1 ] #條件表達式
    then#在Shell腳本里若用到了if判斷語句,那麼判斷成功後一般會執行某些操做,但有時會不 知道執行什麼操做或者不須要執行某些操做。可是又礙於if語句的固定語法格式,不 得不寫一個命令佔位置,由於這一行若是沒有內容就會語法報錯,此時就會用到「:」 這個佔位符,不過請放心,這個命令不會對你的Shell腳本形成任何影響,其有點像 其餘編程語言的pass字段同樣
else
    echo 「hello world」
fi

4.2 ulimit修改系統資源使用限制

4.2.1 命令詳解

功能說明:

ulimit命令用於查看系統資源的使用狀況,同時也能夠修改進程或用戶等對系統資源分配的額度

選項說明:

參數選項 解釋說明
-a 顯示當前全部系統資源使用限制
-n 顯示或設置最多打開的文件數目

4.2.2 使用範例

(1)顯示當前全部系統資源使用限制

[root@Mr_chen ~]# ulimit -a 
core file size          (blocks, -c) 0  #core文件的最大值爲100blocks
data seg size           (kbytes, -d) unlimited  #進程的數據段能夠任意大
scheduling priority             (-e) 0          #調度優先級
file size               (blocks, -f) unlimited  #文件能夠任意大
pending signals                 (-i) 7696       #最多有7696個待處理的信號
max locked memory       (kbytes, -l) 64         #一個任務鎖住的物理內存的最大值爲64KB
max memory size         (kbytes, -m) unlimited  #一個任務的常駐物理內存的最大值
open files                      (-n) 1024       #一個任務最多能夠同時打開1024個文件
pipe size            (512 bytes, -p) 8          #管道的最大空間爲4096(512*8)字節
POSIX message queues     (bytes, -q) 819200     #POSIX的消息隊列的最大值爲819200字節
real-time priority              (-r) 0          #real-time調度優先級
stack size              (kbytes, -s) 10240      #進程的棧的最大值爲10240字節
cpu time               (seconds, -t) unlimited  #進程使用的CPU時間
max user processes              (-u) 7696       #當前用戶同時打開的進程(包括線程)的最大個數爲7696
virtual memory          (kbytes, -v) unlimited  #沒有限制進程的最大地址空間
file locks                      (-x) unlimited  #所能鎖住的文件的最大個數沒有限制

(2)加大服務器打開文件描述符的數量

[root@Mr_chen ~]# ulimit -n
1024        #默認新系統的最大文件打開數(也叫文件描述符)爲1024,這個值對於生產環境的服務器來講過小了,所以一般會在優化服務器環節把這個值調大
[root@Mr_chen ~]# ulimit -n 65535 #調整數量爲65535,可是經過命令調整的只對當前窗口生效,所以須要修改配置文件
[root@Mr_chen ~]# ulimit -n
65535
[root@Mr_chen ~]# echo "* - nofile 65535" >> /etc/security/limits.conf #修改配置文件永久生效,*表示針對任意用戶生效
相關文章
相關標籤/搜索