在咱們進行系統運維的時候,常常須要對服務器上的網絡鏈接狀況進行查看和監控,好比在進行藍鯨系統的部署過程當中某個組件部署失敗,而錯誤提示則指向了網絡鏈接問題,此時咱們須要對網絡鏈接進行檢查:進程的服務端口是否在偵聽?進程的服務端口是否有鏈接?有哪些IP鏈接到了這臺服務器上?有哪些IP鏈接到了特定的端口上?……等等等等。mysql
一般咱們都是在進行跟網絡相關的問題排查時會須要查看服務器上的網絡及端口的鏈接狀況,本文就經過最經常使用的netstat命令來介紹網絡鏈接狀況的查看和監控。下面咱們以按部就班的方式來對幾個不一樣的場景進行介紹。sql
先從最簡單也是最經常使用的命令參數組合開始:netstat -lntup,經過這個命令能夠查看到當前服務器是正在進行偵聽的服務端口。一般咱們會經過這個命令來確認某個端口是否在偵聽,以判斷綁定這個端口的服務進程是否在正常運行中。數組
參數解釋:服務器
-l或--listening:顯示監聽中的服務器的鏈接狀況網絡
-n或--numeric:用數字直接顯示IP地址和端口,而不將其解析成域名或進程名運維
-t或--tcp:顯示TCP傳輸協議的鏈接狀況tcp
-u或--udp:顯示UDP傳輸協議的鏈接狀況spa
-p或--programs:顯示正在使用鏈接的進程ID和進程名稱.net
示例圖以下:3d
從圖中能夠看到,TCP 58725端口正在IP 10.100.104.4上偵聽(LISTEN)中,有PID爲17173的gse_ops進程提供服務
進一步,咱們能夠經過telnet 10.100.104.4 58725來驗證此端口是否能正常接受鏈接。
使用第一步的命令獲得的列表多是很是長的,不便於咱們定位到咱們想要查看的某個特定端口的狀態,因此咱們能夠在上述命令的基礎上,再使用grep命令來定位咱們須要查看的端口:netstat -lntup | grep 「:3306 」。
其中示例命令中的3306是端口後,注意3306前加了個英文冒號:,在後面加了個空格,這樣作的緣由是避免相似如33061,13306這樣的包含了3306的其餘端口號的干擾。經過這樣的篩選後,咱們就將只會看到有關於3306端口的鏈接狀況了。示例圖以下:
從圖中咱們能夠看出,TCP 3306的端口正在由mysqld進程在偵聽中,可是並無顯示出已鏈接了3306端口的其餘鏈接狀況,因此咱們能夠改一下netstat的參數,將-l改爲-a就能夠看到其餘狀態了,以下圖所示:
除了能夠經過篩選端口方式來定位排查外,咱們還能夠經過篩選進程名稱或者進程ID來反查這個進程的端口及其鏈接狀態:netstat -lntup | grep 「mysql」
實例圖以下:
從圖中能夠看出,經過mysql這個進程名稱來篩選,能夠查到其偵聽的是3306這個端口。同理能夠經過篩選1040這個進程ID來進行定位。
利用排序sort和重複計數uniq命令的配合,咱們還能夠對鏈接狀態的數量進行統計:netstat -ant | awk '{print $6}' | sort | uniq –c | sort -n 示例圖以下:
從圖中咱們能夠大體看到這臺服務器的鏈接數量,以此大體評估這臺服務器的繁忙程度。其中前面兩個數量爲1的established和Foreign是從文字描述中截取的內容,能夠忽略。
參數解釋:
netstat -ant:以數字方式列出全部的TCP鏈接狀況;
awk '{print $6}':以空格爲分隔符,將每行的第6個字符串顯示出來;以下圖所示:
sort或sort -n:進行排序,其中-n是根據字符串的數值進行排序
uniq –c:檢查重複出現的行,並將其重複次數顯示出來
基於第四步的鏈接狀態數統計的實現,咱們能夠進一步對鏈接到這臺服務器的IP進行統計:netstat -ant | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq –c | sort -n示例圖以下:
經過鏈接IP數的統計,咱們能夠比較明確地看到有哪些IP跟這臺服務器進行這網絡鏈接通信,以此判斷鏈接是否正常,是否有額外的異常鏈接存在。
參數解釋:
awk -F: '{print $1}':以冒號:爲分隔符,將第1個字符串顯示出來;
awk '{print $5}' | awk -F: '{print $1}':先把結果用空格分隔後的第5個字符串取出,再用冒號分隔後的第1個字符串取出;以下圖所示:
以上就經過使用netstat命令來進行平常系統運維較常見的場景來介紹其使用方法,供你們參考。更多的語法命令可經過查詢幫助或百度獲取。
做者:何立