Heim  >  Artikel  >  Backend-Entwicklung  >  So überwachen Sie Echtzeitdaten eines Remote-Hosts in Python

So überwachen Sie Echtzeitdaten eines Remote-Hosts in Python

WBOY
WBOYnach vorne
2023-05-12 17:55:141580Durchsuche

1 Programmbeschreibungsdokument

1.1 Server

Dieses Programm ist ein Serverprogramm, das auf dem TCP-Protokoll basiert und vom Client gesendete Anweisungen empfangen und den entsprechenden Vorgang ausführen kann und gibt schließlich das Operationsergebnis an den Client zurück. Das Programm läuft auf Port 8888 von localhost (dieser Maschine).

Hauptfunktionen und Befehle:

• CPU-Auslastung abrufen: Befehl „cpu“

• Speicherauslastung abrufen: Befehl „memory“# 🎜🎜#

• Informationen zur Netzwerkbandbreite abrufen: Befehl „Netzwerk“

• Den aktuell angemeldeten Benutzer abrufen: Befehl „Benutzer“

#• Systemlast abrufen: Befehl „loadavg“

• Aktuelle Zeit abrufen: Befehl „time“

• Prozessliste abrufen: Befehl „process“

# 🎜 🎜#• Systeminformationen abrufen: Befehl „system“

• Netzwerkverbindungsliste abrufen: Befehl „connection“

• Festplattennutzung abrufen: Befehl „disk“

Für verschiedene Anweisungen verwendet das Programm verschiedene Bibliotheksfunktionen zur Datenerfassung und -verarbeitung, wie folgt: #🎜🎜 ## 🎜🎜#• Verwenden Sie für die Anweisung „cpu“ die psutil-Bibliothek, um die CPU-Auslastung zu ermitteln.

• Verwenden Sie für die Anweisung „Speicher“ die psutil-Bibliothek, um die Speichernutzung zu ermitteln.

• Verwenden Sie für den Befehl „network“ die Bibliothek „speedtest-cli“, um Informationen zur Netzwerkbandbreite zu erhalten.

• Verwenden Sie für den Befehl „user“ die psutil-Bibliothek, um den aktuell angemeldeten Benutzer abzurufen.

• Verwenden Sie für den Befehl „loadavg“ die Betriebssystembibliothek, um die Systemlast zu ermitteln.

• Für die Anweisung „time“ verwenden Sie die datetime-Bibliothek, um die aktuelle Uhrzeit abzurufen.

• Verwenden Sie für die Anweisung „process“ die psutil-Bibliothek, um die Prozessliste abzurufen. Das Programm sortiert die Prozesse nach Speicherverbrauch und gibt nur die Top-10-Prozesse zurück.

• Verwenden Sie für den Befehl „System“ die Plattformbibliothek, um Systeminformationen abzurufen.

• Verwenden Sie für den Befehl „connection“ die psutil-Bibliothek, um die Liste der Netzwerkverbindungen abzurufen. Das Programm sortiert die Verbindungen nach Prozess-ID und gibt nur die ersten 10 Verbindungen zurück.

• Verwenden Sie für die Anweisung „gpu“ das Tool nvidia-smi, um die GPU-Auslastung zu ermitteln.

• Verwenden Sie für den Befehl „disk“ die psutil-Bibliothek, um die Festplattennutzung abzurufen.

Das Verarbeitungsergebnis jeder Anweisung wird in Form einer Zeichenfolge an den Client zurückgegeben. Bei der Abarbeitung der Anweisung stellt das Programm fest, ob die empfangenen Daten leer sind. Wenn leer, trennen und schließen Sie den Client-Socket. Die Funktion handle_client im Programm ist eine Thread-Funktion, die für die Kommunikation mit einem einzelnen Client verantwortlich ist. Jede Client-Verbindung startet einen Thread.

1.2 Client

Das Programm ist ein einfacher TCP-Client, der sich mit einem Server verbinden und Anfragen an ihn senden und dann auf die Antwort des Servers warten kann. Das Programm verwendet das Socket-Modul von Python, um einen TCP-Socket zu erstellen, und verwendet die Connect-Methode, um eine Verbindung zu einer Serveradresse herzustellen. Das Programm wartet kontinuierlich darauf, dass der Benutzer den Anforderungsdatentyp über eine Schleife eingibt, codiert dann den Anforderungsdatentyp in das UTF-8-Format und sendet ihn mithilfe der Sendall-Methode an den Server. Das Programm wartet dann auf die Antwort des Servers, dekodiert die Antwortdaten in das UTF-8-Format und druckt sie aus. Abschließend schließt das Programm den Client-Socket.

Der Hauptprozess des Programms ist wie folgt:

1 Importieren Sie das Socket-Modul.

2. Erstellen Sie ein TCP-Socket-Objekt.

3. Stellen Sie eine Verbindung zur angegebenen Serveradresse her.

4. Schleife, die darauf wartet, dass der Benutzer den Anforderungsdatentyp eingibt.

5. Kodieren Sie den Anforderungsdatentyp in das UTF-8-Format und senden Sie ihn an den Server.

6. Warten Sie, bis der Server antwortet und die Antwortdaten empfängt.

7. Dekodieren Sie die Antwortdaten in das UTF-8-Format und drucken Sie sie aus.

8. Schließen Sie den Client-Socket.

Mit diesem Programm kann mit Servern kommuniziert werden, die bestimmte Datentypen bereitstellen. Benutzer können verschiedene Anforderungsdatentypen eingeben, um unterschiedliche Datentypen zu erhalten. Der Server gibt je nach Anforderungstyp entsprechende Daten zurück. Der Betrieb des Programms hängt von der Verfügbarkeit und Reaktionsgeschwindigkeit des Servers ab. Wenn der Server nicht antwortet, wartet das Programm, bis der Server antwortet oder das Programm unterbrochen wird.

2 Code

Server

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()

Client

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()

Das obige ist der detaillierte Inhalt vonSo überwachen Sie Echtzeitdaten eines Remote-Hosts in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen