1. 程式人生 > >小菜成長之路,警惕淪為 API 呼叫俠

小菜成長之路,警惕淪為 API 呼叫俠

小菜(化名)在某網際網路公司擔任運維工程師,負責公司後臺業務的運維保障工作。由於自己程式設計經驗不多,平時有不少工作需要開發協助。 聽說 *Python* 很火,能快速開發一些運維指令碼,小菜也加入 *Python* 大軍學起來。 *Python* 語言確實簡單,小菜很快就上手了,覺得自己應對運維開發工作已經綽綽有餘,便不再深入研究。 ## 背景 這天老闆給小菜派了一個數據採集任務,要實時統計伺服器 *TCP* 連線數。需求背景是這樣的:開發同事需要知道服務的連線數以及不同狀態連線的比例,以便判斷服務狀態。 因此,小菜需要開發一個指令碼,定期採集並報告 *TCP* 連線數,提交資料格式定為 *json* : ```json { "LISTEN": 4, "ESTABLISHED": 100, "TIME_WAIT": 10 } ``` 作為運維工程師,小菜當然知道怎麼檢視系統 *TCP* 連線。 *Linux* 系統中有兩個命令可以辦到, *netstat* 和 *ss* : ```shell $ netstat -nat Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:8388 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 192.168.56.3:22 192.168.56.1:54983 ESTABLISHED tcp6 0 0 :::22 :::* LISTEN ``` ```shell $ ss -nat State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:8388 0.0.0.0:* LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* ESTAB 0 0 192.168.56.3:22 192.168.56.1:54983 LISTEN 0 128 [::]:22 [::]:* ``` 小菜還知道 *ss* 命令比 *netstat* 命令要快,但至於為什麼,小菜就不知道了。 小菜很快找到老闆,提出了自己的解決方案:寫一個 *Python* 程式,呼叫 *ss* 命令採集 *TCP* 連線資訊,然後再逐條統計。 老闆告訴小菜,線上伺服器很多都是最小化安裝,並不能保證每臺機器上都有 *ss* 或者 *netstat* 命令。 老闆還告訴小菜,程式開發要學會 **站在巨人的肩膀上** 。動手寫程式碼前,先調研一番,看是否有現成的解決方案。 **切忌重複造輪子** ,浪費時間不說,可能程式碼質量還差,效果也不好。 最後老闆給小菜指了條明路,讓他回去再看看 *psutil* 。 *psutil* 是一個 *Python* 第三方包,用於採集系統性能資料,包括: *CPU* 、記憶體、磁碟、網絡卡以及程序等等。臨走前,老闆還叮囑小菜,完成工作後花點時間研究下這個庫。 ## psutil 方案 小菜搜尋 *psutil* 發現,原來有這麼順手的第三方庫,喜出望外!他立馬裝好 *psutil* ,準備開幹: ```shell $ pip install psutil ``` 匯入 *psutil* 後,一個函式呼叫就可以拿到系統所有連線,連線資訊非常豐富: ```python >>> import psutil >>> for conn in psutil.net_connections('tcp'): ... print(conn) ... sconn(fd=-1, family=