1、查看系統負載命令: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分鍾內系統的平均負載值
這個值的意義是,單位時間段內CPU活動進程數。這個值越大就說明服務器壓力越大。一般情況下這個值不超過服務器cpu數量就沒有關系。假設服務器的cpu數量為8,那么這個值若小於8,就說明當前服務器沒有壓力,否則就要關注一下了。那么如何查看服務器有幾個cpu呢?
[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
2、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分區中,這樣往往對系統的性能產生影響。
3、top動態查看負載
這個命令用於動態監控進程所占系統資源,每隔3s變一次。它的特點是把占用系統資源(CPU,內存,磁盤IO等)最高的進程放到最前面。top命令打印出了很多信息,包括系統負載(loadaverage)、進程數(Tasks)、cpu使用情況、內存使用情況及交換分區使用情況。需要關注的有幾項:%CPU、%MEM、COMMAND。RES為進程所占內存大小,而%MEM為使用內存百分比。在top狀態下,按“shift+m”,可以按照內存使用大小排序。按數字1可以列出各顆cpu的使用狀態。
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號
USER:用戶名
PR:priority其取值范圍是0~39,進程優先級,PR值越小,優先級越高
NI:nice,表示進程優先級狀態的值,其取值范圍是-20~19,一共40個級別。這個值越小,表示進程優先級越高,而值越大,表示優先級越低。
PR+NI=20
VIRT:虛擬內存多大
RES:實際內存使用
SHR:共享內存
S:進程狀態
TIME+:cpu占用時長
top -bn1表示非動態打印系統資源使用情況,可以用在shell腳本中。和tip命令的區別就是,它一次性全部把所有信息輸出出來而非動態顯示。
iostat -x 1 10 查看io,看%until 表示有多少沒有寫入磁盤,等待需要寫入磁盤的,如果過高,就要查看進程了。
沒有iostat命令可以安裝:sysstat-9.0.4-31.el6.i686
4、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:總共流量
6.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進程在進行讀寫
7.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)-->磁盤
8.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:多線程進程
+:代表在前台運行的進程
9.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
10.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'