仇虹 孟彬 孫沖
摘要:針對(duì)網(wǎng)絡(luò)運(yùn)維工作中由于服務(wù)器主機(jī)空間分散導(dǎo)致值勤效率不高的問(wèn)題,設(shè)計(jì)了一款可監(jiān)控遠(yuǎn)程服務(wù)器運(yùn)行信息的軟件。軟件基于python的psutil和wmi模塊采集遠(yuǎn)程主機(jī)的運(yùn)行信息,基于UDP套接字傳送相關(guān)信息,基于SQLite數(shù)據(jù)庫(kù)存儲(chǔ)信息和Tkinter標(biāo)準(zhǔn)庫(kù)設(shè)計(jì)了,運(yùn)行信息在GUI進(jìn)行展示。對(duì)軟件進(jìn)行實(shí)際環(huán)境部署并測(cè)試,運(yùn)維人員可在監(jiān)控端直接查看多臺(tái)服務(wù)器的各類(lèi)關(guān)鍵信息及運(yùn)行狀態(tài)。
關(guān)鍵詞:python;psutil;套接字;Tkinter
中圖分類(lèi)號(hào):TP311.1文獻(xiàn)標(biāo)志碼:A文章編號(hào):1008-1739(2021)02-56-4
0引言
在網(wǎng)絡(luò)運(yùn)維工作中,運(yùn)維人員常需查看服務(wù)器主機(jī)的運(yùn)行狀態(tài),由于空間分散及應(yīng)用服務(wù)器類(lèi)目眾多,需在維護(hù)終端上配置主機(jī)監(jiān)控軟件以達(dá)到查看服務(wù)器主機(jī)運(yùn)行狀態(tài)的目的。市面上的主機(jī)監(jiān)控軟件種類(lèi)繁多,良莠不齊,相當(dāng)一部分被開(kāi)發(fā)人員留有后門(mén),植入廣告或者木馬等,影響服務(wù)器正常工作、危害信息安全。python是一種跨平臺(tái)、面向?qū)ο蟮慕忉屝途幊陶Z(yǔ)言,具有語(yǔ)法簡(jiǎn)潔、形態(tài)豐富、多語(yǔ)言集成三大特點(diǎn),有豐富的第三方庫(kù),是當(dāng)前非常流行的編程語(yǔ)言[1]。本文從客戶(hù)端及服務(wù)端不同需求入手,研究了基于python的信息獲取及網(wǎng)絡(luò)通信過(guò)程,實(shí)現(xiàn)了根據(jù)用戶(hù)需求實(shí)時(shí)獲取目標(biāo)服務(wù)器(主機(jī))的基本信息、CPU和內(nèi)存使用情況、進(jìn)程信息、網(wǎng)絡(luò)配置以及網(wǎng)絡(luò)連接詳情等關(guān)鍵信息。
1軟件系統(tǒng)結(jié)構(gòu)
1.1軟件整體功能設(shè)計(jì)
目標(biāo)服務(wù)器上安裝客戶(hù)端軟件,負(fù)責(zé)采集本主機(jī)的狀態(tài)信息,在維護(hù)終端上安裝負(fù)責(zé)接收及顯示信息的服務(wù)端軟件,可以根據(jù)需求接收每臺(tái)服務(wù)器的狀態(tài)信息,并予以顯示,如圖1所示。
客戶(hù)端程序負(fù)責(zé)采集目標(biāo)服務(wù)器主機(jī)的信息有CPU信息、硬盤(pán)信息、內(nèi)存信息、進(jìn)程詳情、網(wǎng)絡(luò)配置信息、網(wǎng)絡(luò)數(shù)據(jù)統(tǒng)計(jì)信息及網(wǎng)絡(luò)連接信息等。服務(wù)端程序根據(jù)用戶(hù)需求向客戶(hù)端發(fā)送指令,然后接收客戶(hù)端發(fā)送的運(yùn)行信息,并將信息展現(xiàn)給用戶(hù)。
考慮到服務(wù)器承載著重要程序的運(yùn)行,客戶(hù)端程序采取指令式采集,即收到指令、采集信息、反饋信息,以避免占用過(guò)多資源影響服務(wù)器的性能??蛻?hù)端和服務(wù)端使用基于UDP的socket套接字收發(fā)主機(jī)信息和指令,由于UDP套接字用于無(wú)連接、不可靠的數(shù)據(jù)傳輸服務(wù),具有較高的數(shù)據(jù)傳輸效率,在局域網(wǎng)中小批量數(shù)據(jù)傳輸尤為適用[2]。軟件整體框圖如圖2所示。
1.2客戶(hù)端功能設(shè)計(jì)
客戶(hù)端程序運(yùn)行后先建立UDP套接字,然后等待接收指令,根據(jù)接收的指令調(diào)用不同的信息采集模塊,將采集到的信息發(fā)送至服務(wù)端,發(fā)送完畢后等待接收指令??蛻?hù)端程序啟動(dòng)后,獲取的主機(jī)信息發(fā)送給服務(wù)端程序,不需要在本地顯示,因此客戶(hù)端程序不需要GUI設(shè)計(jì)。客戶(hù)端工作流程如圖3所示。鑒于UDP提供無(wú)連接的傳輸服務(wù)和只在收發(fā)數(shù)據(jù)時(shí)才占用端口的特性[3],設(shè)定默認(rèn)的端口號(hào),運(yùn)維人員可根據(jù)實(shí)際情況選擇更改端口號(hào)。
1.3服務(wù)端功能設(shè)計(jì)
運(yùn)維人員在服務(wù)端程序上設(shè)定客戶(hù)端主機(jī)的IP地址和端口號(hào)并存儲(chǔ)在數(shù)據(jù)庫(kù)中,每次監(jiān)控客戶(hù)機(jī)時(shí)只需選擇相應(yīng)IP地址和端口即可,亦可手動(dòng)添加。根據(jù)用戶(hù)需求發(fā)送指令到客戶(hù)端,收到客戶(hù)端反饋的信息后再顯示在GUI上,同時(shí)信息將被存儲(chǔ)在SQLite數(shù)據(jù)庫(kù)中,以供查詢(xún)使用。服務(wù)端工作流程如圖4所示,服務(wù)端需要與用戶(hù)直接交互,因此需要GUI設(shè)計(jì)。
1.4 socket通信設(shè)計(jì)
當(dāng)客戶(hù)端和服務(wù)端通信時(shí),服務(wù)端程序發(fā)送指令使用系統(tǒng)自動(dòng)分配的動(dòng)態(tài)端口號(hào)作為源端口號(hào)、指定端口作為目的端口號(hào),發(fā)送完成后監(jiān)聽(tīng)動(dòng)態(tài)端口等待接收,直到收到客戶(hù)端程序發(fā)來(lái)相應(yīng)的數(shù)據(jù)包后,停止監(jiān)聽(tīng)并關(guān)閉socket??蛻?hù)端程序需要隨時(shí)接收服務(wù)端的指令,因此要保持監(jiān)聽(tīng)端口的狀態(tài)。socket通信示意如圖5示。
2軟件功能的實(shí)現(xiàn)
2.1文件結(jié)構(gòu)
軟件的文件組織結(jié)構(gòu)如圖6示??蛻?hù)端文件中,Client.py負(fù)責(zé)接收客戶(hù)端的指令,根據(jù)指令調(diào)用Get_class.py中的Get_Info類(lèi)的方法獲取信息,再將返回的信息發(fā)給服務(wù)端程序。
計(jì)算機(jī)與網(wǎng)絡(luò)2021年2期