>백엔드 개발 >파이썬 튜토리얼 >Python에서 원격 호스트의 실시간 데이터를 모니터링하는 방법

Python에서 원격 호스트의 실시간 데이터를 모니터링하는 방법

WBOY
WBOY앞으로
2023-05-12 17:55:141622검색

1 프로그램 설명 문서

1.1 서버

이 프로그램은 TCP 프로토콜 기반의 서버 프로그램으로 클라이언트가 보낸 명령을 받아 해당 작업을 수행하고 최종적으로 작업 결과를 클라이언트에 반환할 수 있습니다. 프로그램은 localhost(이 시스템)의 포트 8888에서 실행됩니다.

주요 기능 및 명령:

• CPU 사용량 가져오기: "cpu" 명령

• 메모리 사용량 가져오기: "memory" 명령

• 네트워크 대역폭 정보 가져오기: "network" 명령

• 현재 로그인한 사용자: 명령 "user"

• 명령 "loadavg"

• 현재 시간 가져오기: 명령 "time"

• 명령 "process"

• 시스템 정보 가져오기: 명령 "system"

• 명령 "connection"

• GPU 사용량 가져오기: 명령 "gpu"

• 다양한 명령어의 경우 프로그램은 다음과 같이 데이터 수집 및 처리를 위해 다양한 라이브러리 기능을 사용합니다.

• 명령어 "cpu"의 경우 psutil 라이브러리를 사용하여 CPU 사용량을 얻습니다.

• "memory" 명령의 경우 psutil 라이브러리를 사용하여 메모리 사용량을 확인하세요.

• "network" 명령의 경우 speedtest-cli 라이브러리를 사용하여 네트워크 대역폭 정보를 얻습니다.

• "user" 명령의 경우 psutil 라이브러리를 사용하여 현재 로그인된 사용자를 가져옵니다.

• "loadavg" 명령의 경우 os 라이브러리를 사용하여 시스템 로드 상태를 가져옵니다.

• "time" 명령의 경우 datetime 라이브러리를 사용하여 현재 시간을 가져옵니다.

• "프로세스" 명령의 경우 psutil 라이브러리를 사용하여 프로세스 목록을 가져옵니다. 프로그램은 메모리 사용량에 따라 프로세스를 정렬하고 상위 10개 프로세스만 반환합니다.

• "system" 명령의 경우 플랫폼 라이브러리를 사용하여 시스템 정보를 얻습니다.

• "connection" 명령의 경우 psutil 라이브러리를 사용하여 네트워크 연결 목록을 가져옵니다. 프로그램은 프로세스 ID별로 연결을 정렬하고 처음 10개의 연결만 반환합니다.

• "gpu" 명령의 경우 nvidia-smi 도구를 사용하여 GPU 사용량을 확인하세요.

• "disk" 명령의 경우 psutil 라이브러리를 사용하여 디스크 사용량을 확인하세요.

각 명령어의 처리 결과는 문자열 형태로 클라이언트에 반환됩니다. 명령어를 처리할 때 프로그램은 수신된 데이터가 비어 있는지 여부를 확인합니다. 비어 있으면 클라이언트 소켓의 연결을 끊고 닫습니다. 프로그램의 handler_client 함수는 단일 클라이언트와의 통신을 담당하는 스레드 함수입니다.

1.2 클라이언트

이 프로그램은 서버에 접속하여 요청을 보낸 후 서버의 응답을 기다리는 간단한 TCP 클라이언트입니다. 프로그램은 Python의 소켓 모듈을 사용하여 TCP 소켓을 생성하고 connect 메서드를 사용하여 서버 주소에 연결합니다. 프로그램은 루프를 통해 사용자가 요청 데이터 유형을 입력하기를 지속적으로 기다린 후 요청 데이터 유형을 UTF-8 형식으로 인코딩하여 sendall 메소드를 사용하여 서버로 보냅니다. 그런 다음 프로그램은 서버의 응답을 기다리고 응답 데이터를 UTF-8 형식으로 디코딩하여 인쇄합니다. 마지막으로 프로그램은 클라이언트 소켓을 닫습니다.

프로그램의 주요 프로세스는 다음과 같습니다.

1. 소켓 모듈을 가져옵니다.

2. TCP 소켓 개체를 만듭니다.

3. 지정된 서버 주소에 연결합니다.

4. 사용자가 요청 데이터 유형을 입력하기를 기다리는 루프입니다.

5. 요청 데이터 유형을 UTF-8 형식으로 인코딩하여 서버로 보냅니다.

6. 서버가 응답하고 응답 데이터를 받을 때까지 기다립니다.

7. 응답 데이터를 UTF-8 형식으로 디코딩하여 인쇄합니다.

8. 클라이언트 소켓을 닫습니다.

이 프로그램은 특정 데이터 유형을 제공하는 서버와 통신하는 데 사용할 수 있습니다. 사용자는 다양한 요청 데이터 유형을 입력하여 다양한 유형의 데이터를 얻을 수 있습니다. 서버는 요청 유형에 따라 적절한 데이터를 반환합니다. 프로그램의 작동은 서버의 가용성과 응답 속도에 따라 달라집니다. 서버가 응답하지 않으면 프로그램은 서버가 응답하거나 프로그램이 중단될 때까지 기다립니다.

2 코드

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

위 내용은 Python에서 원격 호스트의 실시간 데이터를 모니터링하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제