仇虹 孟彬 孫沖
摘要:針對網絡運維工作中由于服務器主機空間分散導致值勤效率不高的問題,設計了一款可監控遠程服務器運行信息的軟件。軟件基于python的psutil和wmi模塊采集遠程主機的運行信息,基于UDP套接字傳送相關信息,基于SQLite數據庫存儲信息和Tkinter標準庫設計了,運行信息在GUI進行展示。對軟件進行實際環境部署并測試,運維人員可在監控端直接查看多臺服務器的各類關鍵信息及運行狀態。
關鍵詞:python;psutil;套接字;Tkinter
中圖分類號:TP311.1文獻標志碼:A文章編號:1008-1739(2021)02-56-4

0引言
在網絡運維工作中,運維人員常需查看服務器主機的運行狀態,由于空間分散及應用服務器類目眾多,需在維護終端上配置主機監控軟件以達到查看服務器主機運行狀態的目的。市面上的主機監控軟件種類繁多,良莠不齊,相當一部分被開發人員留有后門,植入廣告或者木馬等,影響服務器正常工作、危害信息安全。python是一種跨平臺、面向對象的解釋型編程語言,具有語法簡潔、形態豐富、多語言集成三大特點,有豐富的第三方庫,是當前非常流行的編程語言[1]。本文從客戶端及服務端不同需求入手,研究了基于python的信息獲取及網絡通信過程,實現了根據用戶需求實時獲取目標服務器(主機)的基本信息、CPU和內存使用情況、進程信息、網絡配置以及網絡連接詳情等關鍵信息。
1軟件系統結構
1.1軟件整體功能設計
目標服務器上安裝客戶端軟件,負責采集本主機的狀態信息,在維護終端上安裝負責接收及顯示信息的服務端軟件,可以根據需求接收每臺服務器的狀態信息,并予以顯示,如圖1所示。

客戶端程序負責采集目標服務器主機的信息有CPU信息、硬盤信息、內存信息、進程詳情、網絡配置信息、網絡數據統計信息及網絡連接信息等。服務端程序根據用戶需求向客戶端發送指令,然后接收客戶端發送的運行信息,并將信息展現給用戶。
考慮到服務器承載著重要程序的運行,客戶端程序采取指令式采集,即收到指令、采集信息、反饋信息,以避免占用過多資源影響服務器的性能。客戶端和服務端使用基于UDP的socket套接字收發主機信息和指令,由于UDP套接字用于無連接、不可靠的數據傳輸服務,具有較高的數據傳輸效率,在局域網中小批量數據傳輸尤為適用[2]。軟件整體框圖如圖2所示。

1.2客戶端功能設計
客戶端程序運行后先建立UDP套接字,然后等待接收指令,根據接收的指令調用不同的信息采集模塊,將采集到的信息發送至服務端,發送完畢后等待接收指令。客戶端程序啟動后,獲取的主機信息發送給服務端程序,不需要在本地顯示,因此客戶端程序不需要GUI設計。客戶端工作流程如圖3所示。鑒于UDP提供無連接的傳輸服務和只在收發數據時才占用端口的特性[3],設定默認的端口號,運維人員可根據實際情況選擇更改端口號。

1.3服務端功能設計
運維人員在服務端程序上設定客戶端主機的IP地址和端口號并存儲在數據庫中,每次監控客戶機時只需選擇相應IP地址和端口即可,亦可手動添加。根據用戶需求發送指令到客戶端,收到客戶端反饋的信息后再顯示在GUI上,同時信息將被存儲在SQLite數據庫中,以供查詢使用。服務端工作流程如圖4所示,服務端需要與用戶直接交互,因此需要GUI設計。

1.4 socket通信設計
當客戶端和服務端通信時,服務端程序發送指令使用系統自動分配的動態端口號作為源端口號、指定端口作為目的端口號,發送完成后監聽動態端口等待接收,直到收到客戶端程序發來相應的數據包后,停止監聽并關閉socket。客戶端程序需要隨時接收服務端的指令,因此要保持監聽端口的狀態。socket通信示意如圖5示。

2軟件功能的實現
2.1文件結構
軟件的文件組織結構如圖6示。客戶端文件中,Client.py負責接收客戶端的指令,根據指令調用Get_class.py中的Get_Info類的方法獲取信息,再將返回的信息發給服務端程序。
