您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python怎么實(shí)現(xiàn)監(jiān)控遠(yuǎn)程主機(jī)實(shí)時(shí)數(shù)據(jù)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Python怎么實(shí)現(xiàn)監(jiān)控遠(yuǎn)程主機(jī)實(shí)時(shí)數(shù)據(jù)文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
本程序?yàn)橐粋€(gè)基于TCP協(xié)議的服務(wù)端程序,可以接收客戶(hù)端發(fā)送的指令并執(zhí)行相應(yīng)的操作,最終將操作結(jié)果返回給客戶(hù)端。程序運(yùn)行在localhost(即本機(jī))的8888端口。
主要功能及指令:
• 獲取CPU使用率:指令“cpu”
• 獲取內(nèi)存使用率:指令“memory”
• 獲取網(wǎng)絡(luò)帶寬信息:指令“network”
• 獲取當(dāng)前登錄用戶(hù):指令“user”
• 獲取系統(tǒng)負(fù)載情況:指令“l(fā)oadavg”
• 獲取當(dāng)前時(shí)間:指令“time”
• 獲取進(jìn)程列表:指令“process”
• 獲取系統(tǒng)信息:指令“system”
• 獲取網(wǎng)絡(luò)連接列表:指令“connection”
• 獲取GPU使用情況:指令“gpu”
• 獲取磁盤(pán)使用情況:指令“disk”
對(duì)于不同的指令,程序采用不同的庫(kù)函數(shù)進(jìn)行數(shù)據(jù)獲取和處理,具體如下:
• 對(duì)于指令“cpu”,使用psutil庫(kù)獲取CPU使用率。
• 對(duì)于指令“memory”,使用psutil庫(kù)獲取內(nèi)存使用率。
• 對(duì)于指令“network”,使用speedtest-cli庫(kù)獲取網(wǎng)絡(luò)帶寬信息。
• 對(duì)于指令“user”,使用psutil庫(kù)獲取當(dāng)前登錄用戶(hù)。
• 對(duì)于指令“l(fā)oadavg”,使用os庫(kù)獲取系統(tǒng)負(fù)載情況。
• 對(duì)于指令“time”,使用datetime庫(kù)獲取當(dāng)前時(shí)間。
• 對(duì)于指令“process”,使用psutil庫(kù)獲取進(jìn)程列表。程序?qū)⑦M(jìn)程按照內(nèi)存使用量排序,只返回前10個(gè)進(jìn)程。
• 對(duì)于指令“system”,使用platform庫(kù)獲取系統(tǒng)信息。
• 對(duì)于指令“connection”,使用psutil庫(kù)獲取網(wǎng)絡(luò)連接列表。程序?qū)⑦B接按照進(jìn)程ID排序,只返回前10個(gè)連接。
• 對(duì)于指令“gpu”,使用nvidia-smi工具獲取GPU使用情況。
• 對(duì)于指令“disk”,使用psutil庫(kù)獲取磁盤(pán)使用情況。
每個(gè)指令的處理結(jié)果均以字符串形式返回給客戶(hù)端。在處理指令時(shí),程序會(huì)判斷接收到的數(shù)據(jù)是否為空。如果為空,則斷開(kāi)連接并關(guān)閉客戶(hù)端套接字。程序中的handle_client函數(shù)是負(fù)責(zé)與單個(gè)客戶(hù)端通信的線(xiàn)程函數(shù),每個(gè)客戶(hù)端連接都會(huì)啟動(dòng)一個(gè)線(xiàn)程。
該程序是一個(gè)簡(jiǎn)單的TCP客戶(hù)端,可以連接到一個(gè)服務(wù)器并向其發(fā)送請(qǐng)求,然后等待服務(wù)器的響應(yīng)。程序使用Python的socket模塊來(lái)創(chuàng)建TCP套接字,并使用connect方法連接到一個(gè)服務(wù)器地址。程序通過(guò)循環(huán)不斷地等待用戶(hù)輸入請(qǐng)求數(shù)據(jù)類(lèi)型,然后將請(qǐng)求數(shù)據(jù)類(lèi)型編碼成UTF-8格式并使用sendall方法將其發(fā)送給服務(wù)器。接著程序等待服務(wù)器響應(yīng),并將響應(yīng)數(shù)據(jù)解碼成UTF-8格式并打印出來(lái)。最后,程序關(guān)閉客戶(hù)端套接字。
程序的主要流程如下:
1. 導(dǎo)入socket模塊。
2. 創(chuàng)建一個(gè)TCP套接字對(duì)象。
3. 連接到指定的服務(wù)器地址。
4. 循環(huán)等待用戶(hù)輸入請(qǐng)求數(shù)據(jù)類(lèi)型。
5. 將請(qǐng)求數(shù)據(jù)類(lèi)型編碼成UTF-8格式并發(fā)送給服務(wù)器。
6. 等待服務(wù)器響應(yīng)并接收響應(yīng)數(shù)據(jù)。
7. 將響應(yīng)數(shù)據(jù)解碼成UTF-8格式并打印出來(lái)。
8. 關(guān)閉客戶(hù)端套接字。
該程序可以用于與提供特定數(shù)據(jù)類(lèi)型的服務(wù)器進(jìn)行通信。用戶(hù)可以輸入不同的請(qǐng)求數(shù)據(jù)類(lèi)型來(lái)獲取不同類(lèi)型的數(shù)據(jù)。服務(wù)器將根據(jù)請(qǐng)求類(lèi)型返回相應(yīng)的數(shù)據(jù)。程序的運(yùn)行依賴(lài)于服務(wù)器的可用性和響應(yīng)速度。如果服務(wù)器無(wú)法響應(yīng),程序?qū)⒁恢钡却?,直到服?wù)器響應(yīng)或者程序被中斷。
服務(wù)端
import os import socket import subprocess import threading from datetime import datetime from sys import platform import psutil from speedtest import Speedtest # 創(chuàng)建TCP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定IP和端口 server_address = ('localhost', 8888) server_socket.bind(server_address) # 監(jiān)聽(tīng)連接請(qǐng)求 server_socket.listen(5) def handle_client(client_socket, client_address): while True: # 接收客戶(hù)端發(fā)送的數(shù)據(jù) data = client_socket.recv(1024) # 如果接收到空數(shù)據(jù),則斷開(kāi)連接 if not data: client_socket.close() print(f"Connection with {client_address} closed") break # 處理接收到的數(shù)據(jù) request = data.decode('utf-8') if request == 'cpu': # 使用psutil庫(kù)獲取CPU使用率 cpu_percent = psutil.cpu_percent(interval=1) response_data = f'CPU使用率:{cpu_percent}%'.encode('utf-8') elif request == 'memory': # 使用psutil庫(kù)獲取內(nèi)存使用率 memory_percent = psutil.virtual_memory().percent response_data = f'內(nèi)存使用率:{memory_percent}%'.encode('utf-8') elif request == 'network': # 使用speedtest-cli庫(kù)獲取網(wǎng)絡(luò)帶寬信息 st = Speedtest() download_speed = st.download() upload_speed = st.upload() response_data = f'下載速度:{download_speed / 1000000}Mbps,上傳速度:{upload_speed / 1000000}Mbps'.encode('utf-8') elif request == 'user': # 使用psutil庫(kù)獲取當(dāng)前登錄用戶(hù) username = psutil.users()[0].name response_data = f'當(dāng)前登錄用戶(hù):{username}'.encode('utf-8') elif request == 'loadavg': # 使用os庫(kù)獲取系統(tǒng)負(fù)載情況 load_avg = os.getloadavg() response_data = f'系統(tǒng)負(fù)載情況:{load_avg}'.encode('utf-8') elif request == 'time': # 使用datetime庫(kù)獲取當(dāng)前時(shí)間 current_time = datetime.datetime.now() response_data = f'當(dāng)前時(shí)間:{current_time}'.encode('utf-8') elif request == 'process': # 使用psutil庫(kù)獲取進(jìn)程列表 process_list = [] for process in psutil.process_iter(['pid', 'name', 'memory_info']): try: process_list.append((process.info['pid'], process.info['name'], process.info['memory_info'].rss)) except (psutil.AccessDenied, psutil.NoSuchProcess): pass process_list.sort(key=lambda x: x[2], reverse=True) response_data = '' for i, (pid, name, memory) in enumerate(process_list[:10]): response_data += f'{i + 1}. 進(jìn)程名稱(chēng):{name},進(jìn)程ID:{pid},占用內(nèi)存:{memory / 1024 / 1024:.2f}MB\n' response_data = response_data.encode('utf-8') elif request == 'system': # 使用platform庫(kù)獲取系統(tǒng)信息 system_info = f'操作系統(tǒng):{platform.system()} {platform.release()}\n處理器:{platform.processor()}\nPython版本:{platform.python_version()}' response_data = system_info.encode('utf-8') elif request == 'connection': # 使用psutil庫(kù)獲取網(wǎng)絡(luò)連接列表 conn_list = [] for conn in psutil.net_connections(): if conn.status == psutil.CONN_ESTABLISHED: conn_list.append((conn.laddr.ip, conn.laddr.port, conn.raddr.ip, conn.raddr.port, conn.pid)) conn_list.sort(key=lambda x: x[4]) response_data = '' for i, (laddr_ip, laddr_port, raddr_ip, raddr_port, pid) in enumerate(conn_list[:10]): response_data += f'{i + 1}. 本地地址:{laddr_ip}:{laddr_port},遠(yuǎn)程地址:{raddr_ip}:{raddr_port},進(jìn)程ID:{pid}\n' response_data = response_data.encode('utf-8') elif request == 'disk': # 使用psutil庫(kù)獲取磁盤(pán)使用情況 disk_usage = psutil.disk_usage('/') disk_info = f'磁盤(pán)總?cè)萘浚簕disk_usage.total / 1024 / 1024 / 1024:.2f}GB,已用容量:{disk_usage.used / 1024 / 1024 / 1024:.2f}GB,可用容量:{disk_usage.free / 1024 / 1024 / 1024:.2f}GB' response_data = disk_info.encode('utf-8') elif request == 'load': # 使用psutil庫(kù)獲取系統(tǒng)負(fù)載 load_avg = psutil.getloadavg() load_info = f'1分鐘內(nèi)平均負(fù)載:{load_avg[0]:.2f},5分鐘內(nèi)平均負(fù)載:{load_avg[1]:.2f},15分鐘內(nèi)平均負(fù)載:{load_avg[2]:.2f}' response_data = load_info.encode('utf-8') elif request == 'thread': # 使用psutil庫(kù)獲取進(jìn)程線(xiàn)程數(shù) thread_info = f'當(dāng)前進(jìn)程線(xiàn)程數(shù):{psutil.Process().num_threads()}' response_data = thread_info.encode('utf-8') else: response_data = b'Invalid request' # 發(fā)送響應(yīng)數(shù)據(jù) client_socket.sendall(response_data) # 接收多個(gè)客戶(hù)端連接 while True: client_socket, client_address = server_socket.accept() print(f"New connection from {client_address}") # 創(chuàng)建新線(xiàn)程處理客戶(hù)端連接 client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_thread.start()
客戶(hù)端
import socket # 創(chuàng)建TCP套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 連接服務(wù)器 server_address = ('localhost', 8888) client_socket.connect(server_address) while True: # 發(fā)送請(qǐng)求數(shù)據(jù)給服務(wù)器 request = input("請(qǐng)輸入要請(qǐng)求的數(shù)據(jù)類(lèi)型(cpu/memory/network/user/loadavg/time/process/system/connection/disk/load/thread):") client_socket.sendall(request.encode('utf-8')) # 接收服務(wù)器響應(yīng)數(shù)據(jù) response_data = client_socket.recv(1024) # 處理接收到的數(shù)據(jù) response = response_data.decode('utf-8') print(response) # 關(guān)閉客戶(hù)端套接字 client_socket.close()
關(guān)于“Python怎么實(shí)現(xiàn)監(jiān)控遠(yuǎn)程主機(jī)實(shí)時(shí)數(shù)據(jù)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Python怎么實(shí)現(xiàn)監(jiān)控遠(yuǎn)程主機(jī)實(shí)時(shí)數(shù)據(jù)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。