fre1228 2023-10-18 22:28 采纳率: 84.4%
浏览 20
已结题

一个实验,ubuntu linux系统资源监控,编写的程序有问题,不知道怎么改

在vm虚拟机里面无法运行不知道哪出问题了

img



import os
import time
import matplotlib.pyplot as plt
# 设置采集间隔时间为5分钟
interval = 5 * 60  
# 定义数据列表
cpu_list = []
mem_list = []
net_list = []
disk_list = []
# 获取系统资源使用情况
def get_system_resources():
    cpu_usage = os.popen("top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}'").read().strip()  # 获取CPU使用率
    mem_usage = os.popen("free -m | awk 'NR==2{printf $3/$2 * 100.0}'").read().strip()  # 获取内存使用率
    net_bw = os.popen("iftop -n -N -F src-port,dst-port | awk '{print $10}' | grep -v '=>' | awk -F 'M' '{print $1}'").read().strip()  # 获取网络带宽使用情况
    disk_usage = os.popen("df -h / | awk 'NR==2{print $5}'").read().strip()  # 获取磁盘使用情况
    
    return cpu_usage, mem_usage, net_bw, disk_usage
# 采集并保存系统资源数据
def log_system_resources():
    while True:
        cpu, mem, net, disk = get_system_resources()
        cpu_list.append(cpu)
        mem_list.append(mem)
        net_list.append(net)
        disk_list.append(disk)
        time.sleep(interval)  # 等待5分钟
        
if __name__ == "__main__":
    log_system_resources()
    
    # 将采集结果输出到桌面并保存为文件
    os.system("echo 'CPU,Memory,Network,Disk' > system_resources.csv")  # 添加标题行
    for i in range(len(cpu_list)):
        os.system(f"echo -e '{cpu_list[i]},{mem_list[i]},{net_list[i]},{disk_list[i]}' >> system_resources.csv")  # 添加数据行
    
    # 读取日志文件并绘制CPU、内存、网络带宽使用情况图
    data = [cpu_list, mem_list, net_list]
    labels = ['CPU', 'Memory', 'Network']
    for i in range(len(data)):
        plt.plot(data[i], label=labels[i])
    plt.legend()
    plt.xlabel('Time (Minutes)')
    plt.ylabel('Usage (%)')
    plt.title('System Resource Usage Over Time')
    plt.savefig('system_resources.png')  # 保存为PNG图片文件
  • 写回答

8条回答 默认 最新

  • 社区专家-Monster-XH 2023-10-18 22:29
    关注

    基于Monster 组和GPT的调写:

    • 在收集系统资源使用情况方面存在一些问题,在处理数据和输出文件方面也有一些问题。
    1. 无限循环问题: log_system_resources() 函数是一个无限循环,这意味着它将永远运行,除非程序被外部终止。这会阻止任何在if __name__ == "__main__":块中该函数调用之后的代码执行。

    2. 数据写入问题: 代码中数据的写入是在无限循环后尝试的,这将永远不会执行。数据应该在while循环的每次迭代中或通过另一个控制机制进行写入。

    3. iftop的问题: iftop需要特权来运行,并且通常要用户交互。此外,它不是所有系统默认的工具,你可能需要在虚拟机中安装它。同时,它的输出也不容易解析,可能不会给出你期望的结果。

    4. matplotlib的使用: 绘图部分永远不会被执行,因为它位于一个无限循环后面。你要重构代码来确保数据收集和绘图都能在适当的时候执行。

    改进包括修复了上述问题:

    import os
    import time
    import matplotlib.pyplot as plt
    import csv
    
    interval = 5 * 60
    
    def get_system_resources():
        cpu_usage = os.popen("top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}'").read().strip()
        mem_usage = os.popen("free -m | awk 'NR==2{printf $3/$2 * 100.0}'").read().strip()
        # 用其他方法代替iftop,例如通过 /proc/net/dev 获取网络数据
        net_data = os.popen("cat /proc/net/dev | awk '{if($1==\"enp0s3:\") print $10}'").read().strip()  # 替换enp0s3为你的网络接口
        disk_usage = os.popen("df -h / | awk 'NR==2{print $5}'").read().strip()
        
        return cpu_usage, mem_usage, net_data, disk_usage
    
    def log_system_resources(duration):
        end_time = time.time() + duration
        with open('system_resources.csv', 'w', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(['CPU', 'Memory', 'Network', 'Disk'])
            while time.time() < end_time:
                resources = get_system_resources()
                writer.writerow([resources[0], resources[1], resources[2], resources[3]])
                time.sleep(interval)
    
    def plot_system_resources():
        cpu_list = []
        mem_list = []
        net_list = []
        with open('system_resources.csv', 'r') as file:
            reader = csv.reader(file)
            next(reader)  # skip header
            for row in reader:
                cpu_list.append(float(row[0]))
                mem_list.append(float(row[1]))
                net_list.append(float(row[2]))  #假设网络数据现在是表示带宽使用情况的浮点数
    
        plt.plot(cpu_list, label='CPU')
        plt.plot(mem_list, label='Memory')
        plt.plot(net_list, label='Network')
        plt.legend()
        plt.xlabel('Time (5 minute intervals)')
        plt.ylabel('Usage (%)')
        plt.title('System Resource Usage Over Time')
        plt.savefig('system_resources.png')
    
    if __name__ == "__main__":
        log_duration = 60 * 60  #例如,记录1小时
        log_system_resources(log_duration)
        plot_system_resources()
    

    在这个版本中

    • while循环记录一定持续时间的资源。
    • 修复了网络带宽获取的问题(你需要根据你的系统修改网络接口)。
    • 通过在每次迭代后写入CSV来存储数据。
    • 添加了一个单独的函数来绘制结果。

    要根据你的环境和需要对代码进行一些调整。此外,考虑到权限和环境配置,某些命令要不同的权限或用户来执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月20日
  • 已采纳回答 10月20日
  • 创建了问题 10月18日