【第十三課】監控Linux系統狀態

一、查看系統負載命令:w、uptime

[root@localhost ~]# w
 23:38:24 up 33 days,  1:03,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.56.1     Fri16    0.00s  0.95s  0.00s w


[root@localhost ~]# uptime 
 23:38:38 up 33 days,  1:03,  1 user,  load average: 0.00, 0.01, 0.05

load average**:1分鐘內系統的平均負載值,5分鐘內系統的平均負載值,15分鐘內系統的平均負載值mysql

這個值的意義是,單位時間段內CPU活動進程數。這個值越大就說明服務器壓力越大。通常狀況下這個值不超過服務器cpu數量就沒有關係。假設服務器的cpu數量爲8,那麼這個值若小於8,就說明當前服務器沒有壓力,不然就要關注一下了。那麼如何查看服務器有幾個cpu呢?ios

[root@localhost ~]# cat /proc/cpuinfo |grep processor #查看cpu核數
processor    : 0
[root@localhost ~]# cat /proc/cpuinfo |grep processor |wc -l
1
[www@wef66fxcdgkbsdsd790fd9z ~]$ cat /proc/cpuinfo |grep processor|wc -l  #線上環境使用了4核
4

二、vmstat詳解

[root@localhost ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0   1540 126124      0 600364    0    0     0     1    4   12  0  1 99  0  0
 0  0   1540 126124      0 600364    0    0     0     0  165  286  0  0 100  0  0
 2  0   1540 126124      0 600364    0    0     0     0  152  280  0  0 100  0  0
 1  0   1540 126124      0 600364    0    0     0     0  157  276  0  1 99  0  0
 1  0   1540 126124      0 600364    0    0     0     0  166  281  1  0 99  0  0

①procs 顯示進程相關信息
r:表示運行和等待cpu時間片的進程數。若是長時間大於服務器cpu的個數,則說明cpu不夠用了
b:表示等待資源的進程數。好比,等待I/O、內存等,這列的值若是長時間大於1,則須要關注一下了

②memory 內存相關信息
swpd:表示切換到交換分區中的內存數量
free:當前空閒的內存數量
buff:緩衝大小,(即將寫入磁盤的)
cache:緩存大小,(從磁盤中讀取的)

③swap 內存交換狀況
si:由交換區寫入到內存的數據量
so:由內存寫入到交換區的數據量

④io 磁盤使用狀況
bi:從塊設備讀取數據的量(讀磁盤)
bo:從塊設備寫入數據的量(寫磁盤)

⑤system 顯示採集間隔內發生的中斷次數
in:表示在某一時間間隔中觀測到的每秒設備中斷數
cs:表示每秒產生的上下文切換次數

⑥CPU 顯示cpu的使用狀態
us:顯示用戶下所花費cpu時間的百分比
sy:顯示系統花費cpu時間百分比
id:表示cpu處於空閒狀態的時間百分比
wa:表示I/O等待所佔用cpu時間百分比
st:表示被偷走的cpu所佔百分比(通常都爲0,不用關注)

以上介紹的各個參數中,比較關注r列、b列、wa列。IO部分的bi以及bo也是常常參考的對象。若是磁盤io壓力很大時,這兩列的數值會比較高。另外當si、so兩列的數值比較高,而且在不斷變化時,說明內存不夠用了,內存中的數據會頻繁交換到swap分區中,這樣每每對系統的性能產生影響。nginx

三、top動態查看負載

這個命令用於動態監控進程所佔系統資源,每隔3s變一次。它的特色是把佔用系統資源(CPU,內存,磁盤IO等)最高的進程放到最前面。top命令打印出了不少信息,包括系統負載(loadaverage)、進程數(Tasks)、cpu使用狀況、內存使用狀況及交換分區使用狀況。須要關注的有幾項:%CPU、%MEM、COMMAND。RES爲進程所佔內存大小,而%MEM爲使用內存百分比。在top狀態下,按「shift+m」,能夠按照內存使用大小排序。按數字1能夠列出各顆cpu的使用狀態。web

top - 15:06:39 up 38 days, 15:09,  1 user,  load average: 0.45, 0.49, 0.52
Tasks: 328 total,   2 running, 326 sleeping,   0 stopped,   0 zombie
%Cpu0  : 12.0 us,  6.7 sy,  0.0 ni, 80.7 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
%Cpu1  :  4.3 us,  3.3 sy,  0.0 ni, 91.7 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
%Cpu2  : 13.0 us,  5.7 sy,  0.0 ni, 81.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu3  : 10.0 us,  4.0 sy,  0.0 ni, 84.6 id,  0.0 wa,  0.0 hi,  1.3 si,  0.0 st
KiB Mem :  8010096 total,   195140 free,  1800572 used,  6014384 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  5398572 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                
24423 www       20   0  586460  38764  24164 S   5.0  0.5  55:44.43 php-fpm                                                                                                
24333 www       20   0  586392  39308  24748 S   4.7  0.5  55:58.71 php-fpm                                                                                                
24328 www       20   0  586336  41876  27360 S   4.3  0.5  55:35.53 php-fpm                                                                                                
24483 www       20   0  586480  37964  23388 S   2.0  0.5  55:41.00 php-fpm                                                                                                
24310 www       20   0  586356  38540  24008 S   1.0  0.5  55:38.32 php-fpm                                                                                                
24311 www       20   0  588468  41120  26536 S   1.0  0.5  56:00.00 php-fpm                                                                                                
24324 www       20   0  586448  39064  24348 S   1.0  0.5  56:09.32 php-fpm                                                                                                
24332 www       20   0  587924  40548  26608 S   1.0  0.5  55:37.79 php-fpm                                                                                                
24341 www       20   0  586456  38224  23572 S   1.0  0.5  56:06.65 php-fpm                                                                                                
24361 www       20   0  586324  38576  24020 S   1.0  0.5  56:12.87 php-fpm                                                                                                
24366 www       20   0  586388  37864  23468 S   1.0  0.5  55:34.51 php-fpm
  • PID:進程ID號sql

  • USER:用戶名docker

  • PR:priority其取值範圍是0~39,進程優先級,PR值越小,優先級越高shell

  • NI:nice,表示進程優先級狀態的值,其取值範圍是-20~19,一共40個級別。這個值越小,表示進程優先級越高,而值越大,表示優先級越低。數據庫

  • PR+NI=20apache

  • VIRT:虛擬內存多大

  • RES:實際內存使用

  • SHR:共享內存

  • S:進程狀態

  • TIME+:cpu佔用時長

    top -bn1表示非動態打印系統資源使用狀況,能夠用在shell腳本中。和tip命令的區別就是,它一次性所有把全部信息輸出出來而非動態顯示。

    iostat -x 1 10 查看io,看%until 表示有多少沒有寫入磁盤,等待須要寫入磁盤的,若是太高,就要查看進程了。

    沒有iostat命令能夠安裝:sysstat-9.0.4-31.el6.i686

四、sar命令(監控網卡流量)

[root@localhost ~]# yum install -y sysstat #若是沒有sar命令,須要安裝sysstat

[www@localhost ~]$ sar -n DEV   #查看網卡流量
Linux 3.10.0-693.21.1.el7.x86_64 (localhost)     07/07/2018     _x86_64_    (4 CPU)

12:00:01 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:10:01 AM      eth0    782.73    391.12    642.35     80.69      0.00      0.00      0.00
12:10:01 AM        lo    182.90    182.90     55.27     55.27      0.00      0.00      0.00
12:20:01 AM      eth0    762.37    384.97    619.17     78.28      0.00      0.00      0.00
12:20:01 AM        lo    182.80    182.80     55.26     55.26      0.00      0.00      0.00
12:30:01 AM      eth0    815.71    414.54    662.49     84.65      0.00      0.00      0.00
12:30:01 AM        lo    184.49    184.49     60.96     60.96      0.00      0.00      0.00
12:40:01 AM      eth0    731.05    354.88    609.65     71.97      0.00      0.00      0.00
12:40:01 AM        lo    179.47    179.47     51.47     51.47      0.00      0.00      0.00
12:50:01 AM      eth0    699.75    345.80    575.08     72.07      0.00      0.00      0.00
12:50:01 AM        lo    177.91    177.91     51.58     51.58      0.00      0.00      0.00
01:00:02 AM      eth0    672.47    319.08    553.33     76.75      0.00      0.00      0.00
01:00:02 AM        lo    178.08    178.08     58.16     58.16      0.00      0.00      0.00
01:10:01 AM      eth0    537.61    287.04    409.51     53.91      0.00      0.00      0.00
01:10:01 AM        lo    174.22    174.22     39.61     39.61      0.00      0.00      0.00
01:20:01 AM      eth0    450.01    250.07    325.20     49.19      0.00      0.00      0.00
01:20:01 AM        lo    171.17    171.17     37.62     37.62      0.00      0.00      0.00
01:30:01 AM      eth0    506.51    257.61    394.53     48.44      0.00      0.00      0.00
01:30:01 AM        lo    170.50    170.50     37.90     37.90      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:          eth0   108.23     87.20     27.30     25.59      0.00      0.00      0.00
Average:           lo     11.34     11.34     61.10     61.10      0.00      0.00      0.00
  • IFACE:表示設備名稱
  • rxpck/s:表示每秒進入收取的包的數量,單位爲"個"
  • txpck/s:表示每秒發送出去的包的數量,單位爲"個"
  • rxkb/s:表示每秒收取的數據量,單位爲kb
  • txkb/s:表示每秒發送的數據量,單位爲kb

若是有一天服務器的丟包很嚴重,此時應觀察這個網卡流量是否異常,若是rxpck/s那一列的數值大於4000,或者rxkb/s那列大於5000,則頗有多是被攻擊了,正常的服務器網卡流量不會高於這麼多,除非是本身在拷貝數據。

實時查看網卡流量每秒打印,打印5次:sar -n DEV 1 5

[www@localhost ~]$ sar -n DEV 1 2
Linux 3.10.0-862.3.2.el7.x86_64 (localhost)     07/07/2018     _x86_64_    (2 CPU)

03:21:47 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
03:21:48 PM      eth0    126.00    101.00     54.70     54.87      0.00      0.00      0.00
03:21:48 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00

03:21:48 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
03:21:49 PM      eth0     66.00     59.00      5.15      5.41      0.00      0.00      0.00
03:21:49 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:         eth0    100.60     85.80     28.03     18.35      0.00      0.00      0.00
Average:           lo      8.00      8.00      3.49      3.49      0.00      0.00      0.00

另外也能夠查看某一天的網卡流量歷史,使用-f選項,後面跟文件名。sar的庫文件在/var/log/sa/目錄下:默認該目錄下文件保留時長爲30天

[www@localhost ~]$ sar -n DEV -f /var/log/sa/sa01
Linux 3.10.0-693.5.2.el7.x86_64 (localhost)     07/01/2018     _x86_64_    (2 CPU)

12:00:01 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:10:01 AM      eth0     49.80     24.46     41.21     15.63      0.00      0.00      0.00
12:10:01 AM        lo      8.97      8.97      0.88      0.88      0.00      0.00      0.00
12:20:01 AM      eth0     50.09     24.56     41.44     15.94      0.00      0.00      0.00
12:20:01 AM        lo      8.93      8.93      0.87      0.87      0.00      0.00      0.00
12:30:01 AM      eth0     50.02     24.68     41.45     15.93      0.00      0.00      0.00
......

ls /var/log/sa/會看到有兩種不一樣的文件,一個是以sa開頭加日期,一個是sar開頭加日期,其中sa加日期的文件爲二進制文件,是不能直接cat查看,只能用sar -f查看,另一種sar加日期的文件是能夠直接cat的。他們都是記錄的系統狀態歷史信息。

也可使用sar查看歷史負載:sar -q,每隔1s打印,打印10次:sar -q 1 10

[www@localhost ~]$ sar -q
Linux 3.10.0-862.3.2.el7.x86_64 (localhost)  07/06/2018  _x86_64_ (2 CPU)

12:00:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
12:10:01 AM         3       356      0.12      0.07      0.05         0
12:20:01 AM        16       354      0.01      0.05      0.05         1
12:30:01 AM        15       354      0.00      0.02      0.05         0
12:40:01 AM         3       362      0.00      0.01      0.05         0
12:50:01 AM         6       353      0.00      0.02      0.05         0

ldavg-1 :1分鐘負載
ldavg-5 :5分鐘負載
ldavg-15:15分鐘負載

5.nload命令(監控網卡流量)

[root@localhost ~]# yum install -y epel-release nload
[root@localhost ~]# nload

(1/2):表示有2個網卡,能夠用箭頭進行來回切換

  • Curr:當前流量
  • Avg:平均流量
  • Min:最小流量
  • Max:最大流量
  • Ttl:總共流量

img

六、iostat iotop(監控IO性能)

[www@localhost ~]$ iostat -x
Linux 3.10.0-693.5.2.el7.x86_64 (loccalhost)     07/07/2018     _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.89    0.00    0.66    0.18    0.00   98.27

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     3.24    0.02    9.94     0.46    64.19    12.99     0.42   42.13   17.21   42.17   0.55   0.55

%util**:表示磁盤IO等待比例。這個數值過大,說明磁盤IO擁堵。說明rkB/s和wkB/s也會增大,若是隻是單純%util較大,說明可能磁盤存在問題。

當發現磁盤IO很忙,須要查看某個進程在讀寫,就可使用iotop**

[root@localhost ~]# yum install -y iotop
[root@localhost ~]# iotop  #能夠看到是mysql進程在進行讀寫

img

七、free(查看內存使用,默認單位是kb)

[www@localhost ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3790         308         153         128        3328        3050
Swap:             0           0           0

total:內存總大小
used:已經使用的內存
free:空閒內存
available:可用內存,包含free和buffer/cache剩餘部分
total=used+free+buff/cache

系統啓動完畢後,會先拿出一部份內存分給buffer、cache,緩存用來隨時提供給程序使用。若是程序不用時,那這部份內存就空閒。寫入磁盤數據時,會把數據寫入buffer,緩衝。cache是從磁盤讀取數據,先放到緩存中。

磁盤-->內存(cache)-->cpu

cpu-->內存(buffer)-->磁盤

八、ps(查看系統進程)

經常使用:ps -elf ps -axu

選項:

-a:顯示全部終端機下執行的程序,除了階段做業領導者以外。
a:顯示現行終端機下的全部程序,包括其餘用戶的程序。
-A:顯示全部程序。
-c:顯示CLS和PRI欄位。
c:列出程序時,顯示每一個程序真正的指令名稱,而不包含路徑,選項或常駐服務的標示。
-C<指令名稱>:指定執行指令的名稱,並列出該指令的程序的情況。
-d:顯示全部程序,但不包括階段做業領導者的程序。
-e:此選項的效果和指定"A"選項相同。
e:列出程序時,顯示每一個程序所使用的環境變量。
-f:顯示UID,PPIP,C與STIME欄位。
f:用ASCII字符顯示樹狀結構,表達程序間的相互關係。
-g<羣組名稱>:此選項的效果和指定"-G"選項相同,當亦能使用階段做業領導者的名稱來指定。
g:顯示現行終端機下的全部程序,包括羣組領導者的程序。
-G<羣組識別碼>:列出屬於該羣組的程序的情況,也可以使用羣組名稱來指定。
h:不顯示標題列。
-H:顯示樹狀結構,表示程序間的相互關係。
-j或j:採用工做控制的格式顯示程序情況。
-l或l:採用詳細的格式來顯示程序情況。
L:列出欄位的相關信息。
-m或m:顯示全部的執行緒。
n:以數字來表示USER和WCHAN欄位。
-N:顯示全部的程序,除了執行ps指令終端機下的程序以外。
-p<程序識別碼>:指定程序識別碼,並列出該程序的情況。
p<程序識別碼>:此選項的效果和指定"-p"選項相同,只在列表格式方面稍有差別。
r:只列出現行終端機正在執行中的程序。
-s<階段做業>:指定階段做業的程序識別碼,並列出隸屬該階段做業的程序的情況。
s:採用程序信號的格式顯示程序情況。
S:列出程序時,包括已中斷的子程序資料。
-t<終端機編號>:指定終端機編號,並列出屬於該終端機的程序的情況。
t<終端機編號>:此選項的效果和指定"-t"選項相同,只在列表格式方面稍有差別。
-T:顯示現行終端機下的全部程序。
-u<用戶識別碼>:此選項的效果和指定"-U"選項相同。
u:以用戶爲主的格式來顯示程序情況。
-U<用戶識別碼>:列出屬於該用戶的程序的情況,也可以使用用戶名稱來指定。
U<用戶名稱>:列出屬於該用戶的程序的情況。
v:採用虛擬內存的格式顯示程序情況。
-V或V:顯示版本信息。
-w或w:採用寬闊的格式來顯示程序情況。 
x:顯示全部程序,不以終端機來區分。
X:採用舊式的Linux i386登錄格式顯示程序情況。
-y:配合選項"-l"使用時,不顯示F(flag)欄位,並以RSS欄位取代ADDR欄位 。
-<程序識別碼>:此選項的效果和指定"p"選項相同。
--cols<每列字符數>:設置每列的最大字符數。
--columns<每列字符數>:此選項的效果和指定"--cols"選項相同。
--cumulative:此選項的效果和指定"S"選項相同。
--deselect:此選項的效果和指定"-N"選項相同。
--forest:此選項的效果和指定"f"選項相同。
--headers:重複顯示標題列。
--help:在線幫助。
--info:顯示排錯信息。
--lines<顯示列數>:設置顯示畫面的列數。
--no-headers:此選項的效果和指定"h"選項相同,只在列表格式方面稍有差別。
--group<羣組名稱>:此選項的效果和指定"-G"選項相同。
--Group<羣組識別碼>:此選項的效果和指定"-G"選項相同。
--pid<程序識別碼>:此選項的效果和指定"-p"選項相同。
--rows<顯示列數>:此選項的效果和指定"--lines"選項相同。
--sid<階段做業>:此選項的效果和指定"-s"選項相同。
--tty<終端機編號>:此選項的效果和指定"-t"選項相同。
--user<用戶名稱>:此選項的效果和指定"-U"選項相同。
--User<用戶識別碼>:此選項的效果和指定"-U"選項相同。
--version:此選項的效果和指定"-V"選項相同。
--widty<每列字符數>:此選項的效果和指定"-cols"選項相同。
[root@localhost ~]# ps -elf |head -n 5
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 31307 ep_pol May31 ?        00:01:56 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root         2     0  0  80   0 -     0 kthrea May31 ?        00:00:00 [kthreadd]
1 S root         3     2  0  80   0 -     0 smpboo May31 ?        00:12:12 [ksoftirqd/0]
1 S root         5     2  0  60 -20 -     0 worker May31 ?        00:00:00 [kworker/0:0H]

[root@localhost ~]# ps axu |head -n 5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3 125228  3408 ?        Ss   May31   1:56 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    May31   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    May31  12:12 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   May31   0:00 [kworker/0:0H]

PID:進程的id

STAT:表示進程的狀態,進程狀態分爲如下幾種(不要求記住,但要了解)

D:不能中斷的進程(一般爲IO),當CPU負載高,而使用率不高,能夠查看是否進程狀態爲D的數量是否較多,該數量較多會影響系統負載值。

R:run狀態的進程,正在運行中的進程

S:sleep狀態的進程,一般狀況下,系統中大部分進程都是這個狀態

T:已經中止或者暫停的進程

W:表示沒有足夠的內存頁分配

X:已經死掉的進程

Z:殭屍進程,殺不掉,打不死的垃圾進程,佔用系統一小點資源,不過沒有關係,若是太多的話就存在問題。

<:高優先級進程

N:低優先級進程

L:在內存中被鎖了內存分頁

s:主進程

l:多線程進程

+:表明在前臺運行的進程

九、netstat(查看網絡狀態)

netstat命令用來打印網絡鏈接情況、系統所開放的端口、路由表等信息。

netstat -lnp:打印當前系統啓動哪些端口

[root@localhost ~]# netstat -lntp  #打印當前系統啓動哪些端口,-t表示只查看tcp的端口,不加-t表示查看全部的端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      5106/nginx: master  
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5106/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      734/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      818/master          
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      25837/php-fpm: mast 
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      43059/mysqld        
tcp6       0      0 :::22                   :::*                    LISTEN      734/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      818/master          
tcp6       0      0 :::2377                 :::*                    LISTEN      977/dockerd         
tcp6       0      0 :::7946                 :::*                    LISTEN      977/dockerd         
udp        0      0 0.0.0.0:4789            0.0.0.0:*                           -                   
udp        0      0 127.0.0.1:323           0.0.0.0:*                           513/chronyd         
udp6       0      0 :::7946                 :::*                                977/dockerd         
udp6       0      0 ::1:323                 :::*                                513/chronyd         
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  2      [ ACC ]     STREAM     LISTENING     22022    981/docker-containe  /var/run/docker/containerd/docker-containerd-debug.sock

還可使用組合命令來查看TCP的狀態統計。關注ESTABLISHED這個數值若是較大,說明網站較忙,1000之內能夠接受。併發較高

[www@localhost ~]$ netstat -an | awk '/^tcp/{++sta[$NF]} END {for(key in sta) print key , sta[key]}'
LISTEN 8
ESTABLISHED 5
TIME_WAIT 173

十、lsof :列出當前系統打開文件的工具(list open files)*

(1)獲取網絡信息

使用-i顯示全部鏈接

[root@localhost ~]# lsof -i
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
chronyd   513 chrony    1u  IPv4   14838      0t0  UDP localhost:323 
chronyd   513 chrony    2u  IPv6   14839      0t0  UDP localhost:323 
sshd      734   root    3u  IPv4   16833      0t0  TCP *:ssh (LISTEN)
sshd      734   root    4u  IPv6   16835      0t0  TCP *:ssh (LISTEN)
master    818   root   13u  IPv4   17273      0t0  TCP localhost:smtp (LISTEN)
master    818   root   14u  IPv6   17274      0t0  TCP localhost:smtp (LISTEN)
dockerd   977   root   21u  IPv6   22761      0t0  TCP *:2377 (LISTEN)
dockerd   977   root   26u  IPv6   22776      0t0  TCP *:7946 (LISTEN)
dockerd   977   root   28u  IPv6   22777      0t0  UDP *:7946 
nginx    5106   root    6u  IPv4 1433341      0t0  TCP *:http (LISTEN)
nginx    5106   root    7u  IPv4 1433342      0t0  TCP *:webcache (LISTEN)
php-fpm 25837   root    6u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25838 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25839 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25840 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25841 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25842 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25843 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
nginx   25857  nginx    6u  IPv4 1433341      0t0  TCP *:http (LISTEN)
nginx   25857  nginx    7u  IPv4 1433342      0t0  TCP *:webcache (LISTEN)
sshd    34937   root    3u  IPv4 1958031      0t0  TCP swarm-manager:ssh->192.168.56.1:61856 (ESTABLISHED)
mysqld  43059  mysql   14u  IPv4  916196      0t0  TCP *:mysql (LISTEN)

使用-i 4僅獲取IPv4流量

[root@localhost ~]# lsof -i 4
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
chronyd   513 chrony    1u  IPv4   14838      0t0  UDP localhost:323 
sshd      734   root    3u  IPv4   16833      0t0  TCP *:ssh (LISTEN)
master    818   root   13u  IPv4   17273      0t0  TCP localhost:smtp (LISTEN)
nginx    5106   root    6u  IPv4 1433341      0t0  TCP *:http (LISTEN)
nginx    5106   root    7u  IPv4 1433342      0t0  TCP *:webcache (LISTEN)
php-fpm 25837   root    6u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25838 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25839 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25840 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25841 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25842 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 25843 apache    0u  IPv4 1491295      0t0  TCP localhost:cslistener (LISTEN)
nginx   25857  nginx    6u  IPv4 1433341      0t0  TCP *:http (LISTEN)
nginx   25857  nginx    7u  IPv4 1433342      0t0  TCP *:webcache (LISTEN)
sshd    34937   root    3u  IPv4 1958031      0t0  TCP swarm-manager:ssh->192.168.56.1:61856 (ESTABLISHED)
mysqld  43059  mysql   14u  IPv4  916196      0t0  TCP *:mysql (LISTEN)

僅顯示TCP鏈接(同理可得到UDP鏈接)

也能夠經過在-i後提供對應的協議來僅僅顯示TCP或者UDP鏈接信息。

[root@localhost ~]# lsof -iUDP
COMMAND PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd 513 chrony    1u  IPv4  14838      0t0  UDP localhost:323 
chronyd 513 chrony    2u  IPv6  14839      0t0  UDP localhost:323 
dockerd 977   root   28u  IPv6  22777      0t0  UDP *:7946

使用-i:port來顯示與指定端口相關的網絡信息

也能夠經過端口搜索,這對於要找出什麼阻止了另一個應用綁定到指定端口實在是太棒了。

[root@localhost ~]# lsof -i:22
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd      734 root    3u  IPv4   16833      0t0  TCP *:ssh (LISTEN)
sshd      734 root    4u  IPv6   16835      0t0  TCP *:ssh (LISTEN)
sshd    34937 root    3u  IPv4 1958031      0t0  TCP swarm-manager:ssh->192.168.56.1:61856 (ESTABLISHED)

使用@host來顯示指定到指定主機的鏈接

在檢查是否開放鏈接到網絡中或互聯網上某個指定主機的鏈接時十分有用。

[root@localhost ~]# lsof -i@192.168.56.11
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    34937 root    3u  IPv4 1958031      0t0  TCP swarm-manager:ssh->192.168.56.1:61856 (ESTABLISHED)

使用@host:port顯示基於主機與端口的鏈接

也能夠組合主機與端口的顯示信息。

[root@localhost ~]# lsof -i@192.168.56.11:22
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    34937 root    3u  IPv4 1958031      0t0  TCP swarm-manager:ssh->192.168.56.1:61856 (ESTABLISHED)

(2)找出監聽端口

找出正等候鏈接的端口。

[root@localhost ~]# lsof -i -sTCP:LISTEN
COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd      734   root    3u  IPv4   16833      0t0  TCP *:ssh (LISTEN)
sshd      734   root    4u  IPv6   16835      0t0  TCP *:ssh (LISTEN)
master    818   root   13u  IPv4   17273      0t0  TCP localhost:smtp (LISTEN)
master    818   root   14u  IPv6   17274      0t0  TCP localhost:smtp (LISTEN)
dockerd   977   root   21u  IPv6   22761      0t0  TCP *:2377 (LISTEN)
dockerd   977   root   26u  IPv6   22776      0t0  TCP *:7946 (LISTEN)

找出已創建的鏈接

[root@localhost ~]# lsof -i -sTCP:ESTABLISHED
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    34937 root    3u  IPv4 1958031      0t0  TCP swarm-manager:ssh->192.168.56.1:61856 (ESTABLISHED)

(3)用戶信息

使用-u顯示指定用戶打開了什麼

[root@localhost ~]# lsof -u nginx
COMMAND   PID  USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
nginx   25857 nginx  cwd       DIR                8,3      265       64 /
nginx   25857 nginx  rtd       DIR                8,3      265       64 /
nginx   25857 nginx  txt       REG                8,3  1132976   738655 /usr/sbin/nginx

殺死指定用戶所作的一切事情

[root@localhost ~]# kill -9 `lsof -t -u mysql`

(4)命令和進程

能夠查看指定程序或進程由什麼啓動,這一般會頗有用,而你可使用lsof經過名稱或進程ID過濾來完成這個任務。下面列出了一些選項:

使用-c查看指定的命令正在使用的文件和網絡鏈接

[root@localhost ~]# lsof -c php-fpm

使用-p查看指定進程ID已打開的內容

[root@localhost ~]# lsof -p 25843

-t選項只返回PID

[root@localhost ~]# lsof -t -c nginx
5106
25857

(5)文件和目錄

經過查看指定文件或目錄,你能夠看到系統上全部正與其交互的資源——包括用戶、進程等。

顯示與指定目錄交互的全部一切

[root@localhost ~]# lsof /var/log/messages/
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
rsyslogd 492 root    6w   REG    8,3   863866 17552622 /var/log/messages

顯示與指定文件交互的全部一切

[root@localhost ~]# lsof /var/log/cron
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
rsyslogd 492 root    4w   REG    8,3    42911 17552620 /var/log/cron

(6)高級用法

與tcpdump相似,當你開始組合查詢時,它就顯示了它強大的功能。

顯示nginx鏈接到192.168.56.11所作的一切

[root@localhost ~]# lsof -u nginx -i @192.168.56.11
COMMAND   PID  USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
nginx   25857 nginx  cwd       DIR                8,3      265       64 /
nginx   25857 nginx  rtd       DIR                8,3      265       64 /
nginx   25857 nginx  txt       REG                8,3  1132976   738655 /usr/sbin/nginx
nginx   25857 nginx  mem       REG                8,3    27616 17547606 /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so

同時使用-t和-c選項以給進程發送 HUP 信號

# kill -HUP `lsof -t -c sshd`

lsof +L1顯示全部打開的連接數小於1的文件

這一般(但不老是)表示某個攻擊者正嘗試經過刪除文件入口來隱藏文件內容。

[root@localhost ~]# lsof +L1
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NLINK     NODE NAME
mysqld  43059 mysql    4u   REG    8,3        0     0 16939513 /var/tmp/ibiJ3IU3 (deleted)
mysqld  43059 mysql    5u   REG    8,3        0     0 17225230 /var/tmp/ibAhlMEQ (deleted)
mysqld  43059 mysql    6u   REG    8,3        0     0 16952289 /var/tmp/ibODsPoD (deleted)
mysqld  43059 mysql    7u   REG    8,3        0     0 17616006 /var/tmp/ibqYeF3c (deleted)
mysqld  43059 mysql   11u   REG    8,3        0     0 17635488 /var/tmp/ibGYCrRc (deleted)

11.抓包工具tchdump

有時候咱們須要查看某個網卡都有哪些數據包,尤爲是當你初步斷定服務器上有流量攻擊時,此時使用抓包工具來抓一下數據包,就能夠知道有哪些ip在攻擊了。

[root@localhost ~]# yum install -y tcpdump
[root@localhost ~]# tcpdump -nn -i eth0
00:42:51.396212 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 141808:142084, ack 1, win 473, length 276
00:42:51.396380 IP 192.168.56.1.53338 > 192.168.56.11.22: Flags [.], ack 142084, win 16110, length 0
00:42:51.396396 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 142084:142264, ack 1, win 473, length 180
00:42:51.396579 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 142264:142540, ack 1, win 473, length 276
00:42:51.396703 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 142540:142720, ack 1, win 473, length 180
00:42:51.396977 IP 192.168.56.1.53338 > 192.168.56.11.22: Flags [.], ack 142720, win 16383, length 0
00:42:51.396989 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 142720:142900, ack 1, win 473, length 180
00:42:51.397119 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 142900:143176, ack 1, win 473, length 276
00:42:51.397206 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 143176:143356, ack 1, win 473, length 180
00:42:51.397370 IP 192.168.56.1.53338 > 192.168.56.11.22: Flags [.], ack 143356, win 16224, length 0
00:42:51.397386 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 143356:143536, ack 1, win 473, length 180
00:42:51.397539 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 143536:143812, ack 1, win 473, length 276
00:42:51.397714 IP 192.168.56.11.22 > 192.168.56.1.53338: Flags [P.], seq 143812:143992, ack 1, win 473, length 180
00:42:51.397875 IP 192.168.56.1.53338 > 192.168.56.11.22: Flags [.], ack 143812, win 16110, length 0

參數解析:

-i:後面跟設備名稱,若是像抓eht0網卡的包,後面則要跟eth0

-nn:是讓第3列和第4列顯示成ip+port端口號形式,若是不加-nn則顯示的是主機名+服務名稱

host:指定ip

prot:指定端口

-c:指定包數量

-w:寫入指定文件裏

若是沒有tcpdump這個命令,咱們須要用「yum install -y tcpdump」命令去安裝一下。上圖中第3列和第4列顯示的信息爲哪個ip+port在鏈接哪個ip+port,後面的信息爲該數據包的相關信息。

直接使用tcpdump -nn -i 網卡名稱展現得太快,沒法全面分析查看,因此將抓包結果輸出到文件

tcpdump -nn -i eth0 -c 100 -w /tmp/1.cap
tcpdump -r /tmp/1.cap
  • 案例使用:

(1)用tcpdump嗅探80端口的訪問哪一個ip最高

[root@localhost ~]# tcpdump -i eth0 -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
102 packets received by filter
0 packets dropped by kernel
     41 IP 192.168.100.171
     29 IP 120.27.173.9
     15 IP 120.27.173.8
      9 IP 120.27.173.41
      6 IP 120.27.173.35

(2)蜘蛛分析,查看是哪些蜘蛛在抓取內容

[root@localhost ~]# tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C57 packets captured
57 packets received by filter
0 packets dropped by kernel

(3)查看數據庫執行的sql

[root@localhost ~]# tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'
相關文章
相關標籤/搜索