雲計算:Linux運維核心管理命令詳解html
想作好運維工做,人先要學會勤快;
居安而思危,勤記而補拙,方可不斷提升;
別人資料不論你用着再如何爽那也是別人的;
本身總結東西是你自身特有的一種思想與理念的展示;
精髓不是看出來的,精髓是記出來的;
請同窗們在學習的過程當中養成好的學習習慣;
勤於實踐,拋棄教案,勤於動手,整理文檔。ios
一,Linux核心進程管理命令nginx
1.1 ps:查看進程正則表達式
1.1.1 命令解釋編程
功能說明ubuntu
ps命令用於列出執行ps命令的那個時刻的進程快照,就像用手機給進程照了一張照片。若是想要動態地顯示進程,就須要使用top命令,該命令相似於把手機切換成錄像模式。vim
選項說明緩存
參數選項安全 |
解釋說明(帶@的爲重點)bash |
-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 命令不接任何參數
- [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命令不接任何參數時,輸出的是使用者當前所在終端(窗口)的進程,其輸出結果中的各項說明以下。
- :PID是進程的標識號
- :TTY是進程所屬的終端控制檯
- :TIME列是進程所使用的總的CPU時間
- :CMD列是正在執行的命令行
(2)ps -ef
- [root@Mr_chen ~]# ps -ef # -e顯示全部進程,-f格外顯示UID,PPID,C與STIME欄位
- 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]
輸出信息中各列說明以下
- UID:進程被該UID所擁有
- PID:進程的標識號
- PPID:進程的父進程的標識號
- C:CPU使用的資源百分比
- STIME:進程開始的時間
- TTY:該進程是在哪一個終端機上面運做,若與終端機無關,則顯示「?」,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡鏈接進主機的進程。
- TIME:進程所使用的總的CPU時間
- 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]
輸出信息中各列的說明以下
- USER:該進程屬於的用戶。
- PID:該進程的進程號。
- %CPU:該進程使用掉的CPU資源百分比。
- %MEM:該進程所佔用的物理內存百分比。
- VSZ:該進程使用掉的虛擬內存量(單位Kbytes)
- RSS:該進程佔用的固定的內存量(單位Kbytes)
- TTY:該進程是在哪一個終端機上面運做的,若與終端機無關,則顯示「?」,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡鏈接進主機的進程。
- STAT:該進程目前的狀態,主要的狀態包括以下幾種。
- R:正在運行,或者是能夠運行。
- S:正在終端睡眠中,能夠由某些信號喚醒。
- D:不可中斷睡眠。
- T:正在偵測或者是中止了。
- Z:已經終止,可是其父進程沒法正常終止它,從而變成zombie(殭屍)進程的狀態
- +:前臺進程。
- l:多線程進程。
- N:低優先級進程。
- <:高優先級進程。
- s:進程領導者。
- L:已將頁面鎖定到內存中。
- START:該進程被觸發啓動的時間
- TIME:該進程實際使用CPU運做的時間
- COMMAND:該進程的實際命令。
(4)顯示指定用戶的相關進程信息
- [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
輸出信息中各列的說明以下
- F:表明這個進程的標誌(flag),4表明使用者爲super user。
- S:表明這個進程的狀態(STAT),前面已經講解過了
- UID:進程被該UID所擁有。
- PID:進程的標識號。
- PPID:父進程的ID。
- C:CPU使用的資源百分比。
- PRI:Priority(優先執行序)的縮寫
- NI:Nice值
- ADDR:指出該進程在內存的哪一個部分。若是是個running的進程,則通常是「-」。
- SZ:使用掉的內存大小。
- WCHAN:目前這個進程是否正在運做當中,若爲「-」則表示正在運做。
- TTY:該進程是在哪一個終端機上面運做的,若與終端機無關,則顯示「?」,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡鏈接進主機的進程。
- TIME:該進程實際使用CPU運做的時間
- 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命令的執行結果
- 16:40:31 當前系統時間
- up 1:48 系統已經運行了1小時48分
- 3 users 當前有2個用戶登陸系統
- load average:0.00, 0.00, 0.00 load average後面三個數分別是1分鐘、5分鐘、15分鐘的平均負載狀況
- 第二行,Tasks爲任務(進程)。從上面的信息能夠看出,系統如今共有77個進程,其中處於運行狀態的有1個,76個在休眠(sleep),stoped狀態0個,zombie狀態(僵死)的有0個。
- 第三行,CPU狀態信息
- 0.0%us 用戶空間佔用CPU的百分比
- 0.0%sy 內核空間佔用CPU的百分比
- 0.0%ni 改變過優先級的進程佔用CPU的百分比
- 100.0%id 空閒CPU百分比
- 0.0%wa I/O等待佔用CPU的百分比
- 0.0%hi 硬中斷(Hardware IRQ)佔用CPU的百分比
- 0.0%si 軟中斷(Software Interrupts)佔用CPU的百分比
- 0.0%st 虛擬機佔用CPU的百分比
- 第四行,內存狀態
- 1004412k total 物理內存總量
- 152112k used 使用中的內存總量
- 852300k free 空閒內存總量
- 11312k buffers 緩衝的內存量
- 第五行,swap交換分區信息
- 2031608k total 交換區總量
- 0k used 使用的交換區總量
- 2031608k free 空閒交換區總量
- 42304k cached 緩存的內存量
- 第六行,空行
- 第七行開始,給出的是各進程(任務)的狀態監控
- PID 進程id
- USER 進程全部者
- PR 進程優先級
- NI nice值,負值表示高優先級,正值表示低優先級。
- VIRT 進程使用的虛擬內存總量,單位kb。
- RES 進程使用的、未被換出的物理內存大小,單位爲kb。
- SHR 共享內存大小,單位爲kb
- S 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/中止 Z=殭屍進程
- %CPU 上次更新到如今的CPU時間佔用百分比
- %MEM 進程使用的物理內存百分比
- TIME+ 進程使用的CPU時間總計,單位1/100秒
- COMMAND 進程名稱(命令名/命令行)
特別提示:
1)計算真正可用的內存數爲:第四行的free+第四行的buffers+第五行的cached
2)在對內存進行監控時,咱們要時刻關注top命令裏第五行swap交換分區的used,若是這個數值還在不斷地變化,則說明內核正在不斷進行內存和swap的數據交換,這表示內存真的不夠用了或者程序運行有內存溢出問題。
(2)顯示多核不一樣核CPU的信息
在top基本視圖中,按鍵盤數字「1」,可監控每一個邏輯CPU的情況。
從上圖能夠發現,服務器有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
小結:
- :刪除網卡的主IP地址,同時會刪除該網卡的全部IP地址
- :刪除網卡的輔助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正在監聽的鏈接信息
- -l : 顯示全部LISTEN狀態的網絡鏈接
- -n : 顯示IP地址,不進行DNS解析成主機名,域名
- -t : 顯示全部TCP鏈接
- -u : 顯示全部UDP鏈接
- -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
如下是命令結果解釋
- Iface : 表示網絡設備的接口名稱
- MTU : 表示最大傳輸單元,單位爲字節
- RX-OK/TX-OK : 表示已經準確無誤地接收/發送了多少數據包
- RX-ERR/TX-ERR : 表示接收/發送數據包時產生了多少錯誤
- RX-DRP/TX-DRP : 表示接收/發送數據包時丟棄了多少數據包
- RX-OVR/TX-OVR : 表示因爲偏差而遺失了多少數據包。
- 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 #顯示全部正在監聽的TCP和UDP鏈接
- 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 #統計當前的established,closed,orphaned和waiting的TCP 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
如下是命令說明
- -c 3:發送3次ICMP包
- -i 3:每次發包時間間隔爲3s
- -s 1024:設置發送的數據包大小爲1024字節
- -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+C了
- tcpdump: 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
如下是命令的結果說明
- 05:46:06.865643:當前時間,精確到微妙
- IP localhost.ssh > localhost.50832:從主機localhost的SSH端口發送數據到localhost的50832端口,「>」表明數據流向
- Flags [P.]:TCP包中的標誌信息,S是SYN標誌的縮寫,F(FIN),P(PUSH),R(RST),「.」(沒有標記)。
- seq:數據包中的數據的順序號。
- ack:下次指望的順序號
- win:接收緩存的窗口大小
- 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,關鍵字爲src(source,源地址)
- 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,關鍵字爲dst(destination,目的地)
- 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鏈接的三個階段
2)TCP鏈接圖示
TCP鏈接的狀態機制以下圖所示
3)TCP的狀態標識
- SYN:(同步序列編號,Synchronize Sequence Numbers)該標誌僅在三次握手創建TCP鏈接時有效。表示一個新的TCP鏈接請求
- ACK:(確認編號,Acknowledgement Number)是對TCP請求的確認標誌,同時提示對端系統已經成功接收了全部的數據。
- 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也是1460)
- 22: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進程在使用。
輸出中每列的含義具體以下:
- COMMAND:命令,進程的名稱。
- PID:進程號。
- USER:進程的全部者。
- FD:文件描述符,它又包含以下內容
- 0:表示標準輸出。
- 1:表示標準輸入。
- 2:表示標準錯誤。
- u:表示該文件被打開並處於讀取/寫入模式
- r:表示該文件被打開並處於只讀模式
- w:表示該文件被打開並處於寫入模式
- TYPE:文件類型,REG(regular)爲普通文件
- DEVICE:指定磁盤的名稱。
- SIZE/OFF:文件的大小
- NODE:索引節點
- 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]
其中各項的含義以下:
- 46:4表明IPv4,6表明IPv6
- protocol:傳輸協議,能夠是TCP或UDP
- hostname:主機名稱或者IP地址
- service:進程的服務名,例如NFS,SSH和FTP等。
- 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
針對上面的輸出,有如下說明
- Linux系統的特性是將不用的物理內存緩存起來,所以897MB不是系統的真實剩餘內存。
- 系統真正可用的內存爲925MB
- buffers爲寫入數據緩衝區
- 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
上圖爲iftop界面,相關說明以下:
- 界面上顯示的是相似刻度尺的刻度範圍,是以標尺的形式顯示流量圖形的長條
- 中間的<=或=>這兩個左右箭頭,表示的是流量的反向
- TX:發送流量
- RX:接收流量
- TOTAL:總流量
- Cum:運行iftop到目前時間的總流量
- peak:流量峯值
- 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
命令說明具體以下:
- -n:不進行DNS解析,顯示IP數字地址
- -N:顯示數字形式的端口號
- -P:顯示端口號
- -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
- r列表示運行和等待CPU時間片的進程數。
- b列表示正在等待資源的進程數。
第2列:memory
- swpd列表示使用虛擬內存的大小。
- free列表示當前空閒的物理內存數量.
- buff列表示buffers的內存數量.
- cache列表示cache的內存數量.
第3列:swap
- si(swap in)列表示由磁盤調入內存,也就是內存進入內存交換區的數量。
- so(swap out)列表示由內存調入磁盤,也就是內存交換區進入內存的數量。
第4列:I/O項顯示磁盤讀寫情況
- bi列表示從塊設備讀入數據的總量(即讀磁盤)(塊/s)
- bo列表示寫入塊設備的數據總量(即寫磁盤))(塊/s)
第5列:system顯示採集間隔內發生的中斷數
- in列表示在某一時間間隔中觀測到的每秒設備中斷數。
- cs列表示每秒產生的上下文切換次數。
第6列:CPU項顯示了CPU的使用狀態
- us列顯示了用戶進程消耗的CPU時間百分比。
- sy列顯示了系統(內核)進程消耗的CPU時間百分比。
- id列顯示了CPU處在空閒狀態的時間百分比。
- wa列顯示了I/O等待所佔用的CPU時間百分比
- 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兩列,其說明具體以下。
- inact:非活躍的內存大小(當使用-a選項時顯示)
- 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。各列的說明具體以下
- reads:來自於該分區的讀的次數
- read sectors:來自於該分區的讀扇區的次數
- writes:來自於該分區的寫的次數
- 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列的含義分別以下:
- %usr:用戶進程消耗的CPU時間百分比。
- %nice:改變過優先級的進程佔用的CPU時間百分比
- %sys:系統(內核)進程消耗的CPU時間百分比
- %iowait:IO等待所佔用的CPU時間百分比
- %irq:硬中斷佔用的CPU時間百分比
- %soft:軟中斷佔用的CPU時間百分比
- %steal:虛擬機強制CPU等待的時間百分比
- %guest:虛擬機佔用CPU時間的百分比
- %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行中各列的含義具體以下
- %user : 用戶進程消耗的CPU時間百分比
- %nice : 改變過優先級的進程佔用的CPU時間百分比
- %system : 系統(內核)進程消耗的CPU時間百分比
- %iowait : IO等待所佔用的CPU時間百分比
- %steal : 虛擬機強制CPU等待的時間百分比
- %idle : CPU處在空閒狀態的時間百分比
第3~4行中各列的含義以下
- tps : 表示該設備每秒的傳輸次數,「一次傳輸」的意思是「一次I/O請求」,多個邏輯請求可能會被合併爲「一次I/O請求」,「一次傳輸」請求的大小是未知的。
- Blk_read/s : 表示每秒讀取的數據塊數
- Blk_wrtn/s : 表示每秒寫入的數據塊數
- Blk_read : 表示讀取的全部塊數
- 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 #選項-k以KB爲單位顯示數據
- 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 #選項-m以MB爲單位顯示數據
- 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
如下是命令結果說明
- rrqm/s:每秒進行merge的讀操做數目
- wrqm/s:每秒進行merge的寫操做數目
- r/s:每秒完成的讀I/O設備次數
- w/s:每秒完成的寫I/O設備次數
- rkB/s:每秒讀入的千字節數
- wkB/s:每秒寫入的千字節數
- avgrq-sz:設備平均每次進行I/O操做的數據大小(扇區)
- avgqu-sz:平均I/O隊列長度
- await:設備平均每次I/O操做的等待時間(毫秒)
- svctm:設備平均每次I/O操做的服務時間(毫秒)
- %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]
如下是命令結果的具體說明
- Total DISK READ:總的磁盤讀取速度
- Total DISK WRITE:總的磁盤寫入速度
- TID:進程pid值
- PRIO:優先級
- USER:用戶
- DISK READ:磁盤讀取速度
- DISK WRITE:磁盤寫入速度
- SWAPIN:從swap分區讀取數據佔用的百分比
- IO:I/O佔用的百分比
- 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
如下是命令結果的詳細說明
- %user:用戶進程消耗的CPU時間百分比
- %nice:改變過優先級的進程佔用的CPU時間百分比
- %system:系統(內核)進程消耗的CPU時間百分比
- %iowait:IO等待所佔用的CPU時間百分比
- steal:虛擬機強制CPU等待的時間百分比
- 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
如下是命令結果的詳解說明
- runq-sz:運行隊列的長度(等待運行的進程數)
- plist-sz:進程列表中進程(process)和線程(thread)的數量
- ldavg-1:最後一分鐘的系統平均負載(system load average)
- ldavg-5:過去5分鐘的系統平均負載
- 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
如下命令結果的詳細說明
- kbmemfree:空閒物理內存量
- kbmemused:使用中的物理內存量
- %memused:物理內存量的使用率
- kbbuffers:內核中做爲緩衝區使用的物理內存容量
- kbcached:內核中做爲緩存使用的物理內存容量
- kbcommit:應用程序當前使用的內存大小
- %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
如下是命令的詳細結果說明
- tps:每秒鐘物理設備的I/O傳輸總量
- rtps:每秒鐘從物理設備讀入的數據總量
- wtps:每秒鐘向物理設備寫入的數據總量
- bread/s:每秒鐘從物理設備讀入的數據量,單位爲塊/s
- 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
如下是命令結果的詳細說明
- IFACE:網絡接口
- rxpck/s:每秒鐘接收的數據包
- txpck/s:每秒鐘發送的數據包
- rxkB/s:每秒鐘接收的字節數
- txkB/s:每秒鐘發送的字節數
- rxcmp/s:每秒鐘接收的壓縮數據包
- txcmp/s:每秒鐘發送的壓縮數據包
- 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
如下是命令結果的詳細說明
- IFACE:網絡接口
- rxerr/s:每秒鐘接收的壞數據包
- txerr/s:每秒鐘發送的壞數據包
- coll/s:每秒的衝突數
- rxdrop/s:由於緩衝充滿,每秒鐘丟棄的已接收數據包數
- txdrop/s:由於緩衝充滿,每秒鐘丟棄的已發送數據包數
- txcarr/s:發送數據包時,每秒載波錯誤數
- rxfram/s:每秒接收數據包的幀對齊錯誤數
- rxfifo/s:接收的數據包每秒FIFO過速的錯誤數
- 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
如下是命令結果的詳細說明
- totsck:使用的套接字總數量
- tcpsck:使用的TCP套接字數量
- udpsck:使用的UDP套接字數量
- rawsck:使用的raw套接字數量
- ip-frag:使用的IP段數量
- 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
如下是命令結果的詳細說明
- DEV:表示磁盤的設備名稱
- tps:表示該設備每秒的傳輸次數,「一次傳輸」的意思是「一次I/O請求」,多個邏輯請求可能會被合併爲「一次I/O請求」,「一次傳輸」請求的大小是未知的。
- rd_sec/s:表示每秒從設備讀取的扇區數
- wr_sec/s:表示每秒寫入設備的扇區數目
- avgrq-sz:設備平均每次I/O操做的數據大小(扇區)
- avgqu-sz:平均I/O隊列長度
- await:設備平均每次I/O操做的等待時間(毫秒)
- svctm:設備平均每次I/O操做的服務時間(毫秒)
- %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 #修改配置文件永久生效,*表示針對任意用戶生效