小菜成長之路,警惕淪為 API 呼叫俠
阿新 • • 發佈:2020-06-11
小菜(化名)在某網際網路公司擔任運維工程師,負責公司後臺業務的運維保障工作。由於自己程式設計經驗不多,平時有不少工作需要開發協助。
聽說 *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=