首頁 >後端開發 >Python教學 >Python怎麼實現監控遠端主機即時數據

Python怎麼實現監控遠端主機即時數據

WBOY
WBOY轉載
2023-05-12 17:55:141623瀏覽

1 程式說明文件

1.1 服務端

本程序為一個基於TCP協定的服務端程序,可以接收客戶端發送的指令並執行對應的操作,最終將操作結果傳回給客戶端。程式運行在localhost(即本機)的8888埠。

主要功能與指令:

• 取得CPU使用率:指令「cpu」

• 取得記憶體使用率:指令「memory」

• 取得網路頻寬資訊:指令「network」

• 取得目前登入使用者:指令「user」

• 取得系統負載狀況:指令「loadavg」

• 取得目前時間:指令「time」

• 取得進程清單:指令「process」

• 取得系統資訊:指令「system」

• 取得網路連線清單:指令「connection」

• 取得GPU使用情況:指令「gpu」

• 取得磁碟使用情況:指令「disk」

對於不同的指令,程式採用不同的函式庫函數進行資料取得與處理,具體如下:

• 對於指令“cpu”,使用psutil函式庫取得CPU使用率。

• 對於指令“memory”,使用psutil函式庫取得記憶體使用率。

• 對於指令“network”,使用speedtest-cli庫取得網路頻寬資訊。

• 對於指令“user”,使用psutil庫取得目前登入使用者。

• 對於指令“loadavg”,使用os庫取得系統負載狀況。

• 對於指令“time”,使用datetime庫取得目前時間。

• 對於指令“process”,使用psutil庫取得進程清單。程式將進程依照記憶體使用量排序,只回傳前10個進程。

• 對於指令“system”,使用platform庫取得系統資訊。

• 對於指令“connection”,使用psutil庫取得網路連線清單。程式將連線依照進程ID排序,只回傳前10個連線。

• 對於指令“gpu”,使用nvidia-smi工具取得GPU使用情況。

• 對於指令“disk”,使用psutil函式庫取得磁碟使用量。

每個指令的處理結果均以字串形式傳回給客戶端。在處理指令時,程式會判斷接收到的資料是否為空。如果為空,則斷開連線並關閉客戶端套接字。程式中的handle_client函數是負責與單一客戶端通訊的執行緒函數,每個客戶端連線都會啟動一個執行緒。

1.2 客戶端

該程式是一個簡單的TCP客戶端,可以連接到一個伺服器並向其發送請求,然後等待伺服器的回應。程式使用Python的socket模組來建立TCP套接字,並使用connect方法連接到一個伺服器位址。程式透過循環不斷地等待使用者輸入請求資料類型,然後將請求資料類型編碼成UTF-8格式並使用sendall方法將其傳送給伺服器。接著程式等待伺服器回應,並將回應資料解碼成UTF-8格式並列印出來。最後,程式關閉客戶端套接字。

程式的主要流程如下:

1. 導入socket模組。

2. 建立一個TCP套接字物件。

3. 連接到指定的伺服器位址。

4. 循環等待使用者輸入請求資料類型。

5. 將請求資料類型編碼成UTF-8格式並傳送給伺服器。

6. 等待伺服器回應並接收回應資料。

7. 將回應資料解碼成UTF-8格式並列印出來。

8. 關閉客戶端套接字。

該程式可以用於與提供特定資料類型的伺服器進行通訊。使用者可以輸入不同的請求資料類型來取得不同類型的資料。伺服器將根據請求類型傳回相應的資料。程式的運作依賴於伺服器的可用性和回應速度。如果伺服器無法回應,程式將等待,直到伺服器回應或程式中斷。

2 代碼

服務端

import os
import socket
import subprocess
import threading
from datetime import datetime
from sys import platform

import psutil
from speedtest import Speedtest

# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

# 监听连接请求
server_socket.listen(5)


def handle_client(client_socket, client_address):
    while True:
        # 接收客户端发送的数据
        data = client_socket.recv(1024)

        # 如果接收到空数据,则断开连接
        if not data:
            client_socket.close()
            print(f"Connection with {client_address} closed")
            break

        # 处理接收到的数据
        request = data.decode('utf-8')
        if request == 'cpu':
            # 使用psutil库获取CPU使用率
            cpu_percent = psutil.cpu_percent(interval=1)
            response_data = f'CPU使用率:{cpu_percent}%'.encode('utf-8')
        elif request == 'memory':
            # 使用psutil库获取内存使用率
            memory_percent = psutil.virtual_memory().percent
            response_data = f'内存使用率:{memory_percent}%'.encode('utf-8')
        elif request == 'network':
            # 使用speedtest-cli库获取网络带宽信息
            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库获取当前登录用户
            username = psutil.users()[0].name
            response_data = f'当前登录用户:{username}'.encode('utf-8')
        elif request == 'loadavg':
            # 使用os库获取系统负载情况
            load_avg = os.getloadavg()
            response_data = f'系统负载情况:{load_avg}'.encode('utf-8')
        elif request == 'time':
            # 使用datetime库获取当前时间
            current_time = datetime.datetime.now()
            response_data = f'当前时间:{current_time}'.encode('utf-8')
        elif request == 'process':
            # 使用psutil库获取进程列表
            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}. 进程名称:{name},进程ID:{pid},占用内存:{memory / 1024 / 1024:.2f}MB\n'
            response_data = response_data.encode('utf-8')
        elif request == 'system':
            # 使用platform库获取系统信息
            system_info = f'操作系统:{platform.system()} {platform.release()}\n处理器:{platform.processor()}\nPython版本:{platform.python_version()}'
            response_data = system_info.encode('utf-8')
        elif request == 'connection':
            # 使用psutil库获取网络连接列表
            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},远程地址:{raddr_ip}:{raddr_port},进程ID:{pid}\n'
            response_data = response_data.encode('utf-8')
        elif request == 'disk':
            # 使用psutil库获取磁盘使用情况
            disk_usage = psutil.disk_usage('/')
            disk_info = f'磁盘总容量:{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库获取系统负载
            load_avg = psutil.getloadavg()
            load_info = f'1分钟内平均负载:{load_avg[0]:.2f},5分钟内平均负载:{load_avg[1]:.2f},15分钟内平均负载:{load_avg[2]:.2f}'
            response_data = load_info.encode('utf-8')
        elif request == 'thread':
            # 使用psutil库获取进程线程数
            thread_info = f'当前进程线程数:{psutil.Process().num_threads()}'
            response_data = thread_info.encode('utf-8')
        else:
            response_data = b'Invalid request'

        # 发送响应数据
        client_socket.sendall(response_data)


# 接收多个客户端连接
while True:
    client_socket, client_address = server_socket.accept()
    print(f"New connection from {client_address}")
    # 创建新线程处理客户端连接
    client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
    client_thread.start()

客戶端

import socket

# 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)

while True:
    # 发送请求数据给服务器
    request = input("请输入要请求的数据类型(cpu/memory/network/user/loadavg/time/process/system/connection/disk/load/thread):")
    client_socket.sendall(request.encode('utf-8'))

    # 接收服务器响应数据
    response_data = client_socket.recv(1024)

    # 处理接收到的数据
    response = response_data.decode('utf-8')
    print(response)

# 关闭客户端套接字
client_socket.close()

以上是Python怎麼實現監控遠端主機即時數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除