You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python获取Ubuntu系统特定用户时段内CPU和RAM使用报告?

问题解答

一、Ubuntu默认是否存储用户CPU/RAM历史数据?

  • 答案是没有。Ubuntu默认系统日志(如/var/log/syslog、/var/log/auth.log)仅记录系统事件、认证信息等,不会追踪单个用户的CPU时钟消耗、RAM使用量这类历史数据。
  • 实时工具如top、htop只能查看当前状态,无历史留存;sar(系统活动报告工具)默认记录系统级资源使用,但不按用户维度存储,需额外配置。

二、有没有现成的Python模块直接获取这类历史数据?

没有专门的Python模块可直接提取指定日期区间内特定用户的CPU/RAM历史报告。但可以通过Python调用系统工具(如配置后的sar),或基于提前采集的监控数据进行处理——前提是你已开启用户维度的资源监控。

三、纯Python实现的切入点与方案

若没有提前的监控数据,需先实现实时监控采集工具,定期记录用户资源使用数据,再开发查询功能生成报告。

1. 数据采集核心切入点

  • 过滤用户进程:用psutil(Python常用系统监控库)获取所有进程,通过username属性筛选目标用户的进程。
  • CPU使用量计算:
    • 调用psutil.Process.cpu_times()获取进程的用户态、系统态CPU时间(单位:秒),累计目标用户所有进程的该值,得到总CPU时间;若需换算为时钟数,需乘以CPU主频。
    • 定期采集(如每10秒),记录时间戳、用户名、累计CPU时间。
  • RAM使用量计算:
    • 调用psutil.Process.memory_info().rss获取进程常驻内存大小(单位:字节),求和目标用户所有进程的RSS值,得到总RAM使用量,同步记录时间戳和用户名。

2. 数据存储

用Python内置的SQLite数据库存储数据,无需额外安装。示例表结构:

CREATE TABLE user_resource_usage (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
    username TEXT NOT NULL,
    cpu_seconds REAL NOT NULL,
    ram_bytes INTEGER NOT NULL
);

3. 历史查询功能

根据指定日期区间从数据库筛选目标用户的记录,计算总CPU消耗、RAM峰值/平均值等生成报告。示例代码:

import sqlite3
from datetime import datetime

def get_user_usage_report(username, start_date, end_date):
    conn = sqlite3.connect('resource_monitor.db')
    cursor = conn.cursor()
    query = """
        SELECT timestamp, cpu_seconds, ram_bytes
        FROM user_resource_usage
        WHERE username = ? 
          AND timestamp BETWEEN ? AND ?
        ORDER BY timestamp
    """
    cursor.execute(query, (username, start_date, end_date))
    records = cursor.fetchall()
    conn.close()

    report = {
        "total_cpu_seconds": sum(r[1] for r in records),
        "max_ram_bytes": max(r[2] for r in records) if records else 0,
        "usage_history": records
    }
    return report

4. 后台运行监控脚本

用Linux的cron任务或Python的schedule模块,让采集脚本定期运行(如每分钟一次)。示例采集片段:

import psutil
import sqlite3
from datetime import datetime

def collect_user_usage():
    conn = sqlite3.connect('resource_monitor.db')
    cursor = conn.cursor()
    users_processes = {}

    for proc in psutil.process_iter(['pid', 'username', 'cpu_times', 'memory_info']):
        try:
            username = proc.info['username']
            cpu_time = proc.info['cpu_times'].user + proc.info['cpu_times'].system
            ram_rss = proc.info['memory_info'].rss

            if username not in users_processes:
                users_processes[username] = {'cpu': 0, 'ram': 0}
            users_processes[username]['cpu'] += cpu_time
            users_processes[username]['ram'] += ram_rss
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue

    current_time = datetime.now().isoformat()
    for username, usage in users_processes.items():
        cursor.execute("""
            INSERT INTO user_resource_usage (timestamp, username, cpu_seconds, ram_bytes)
            VALUES (?, ?, ?, ?)
        """, (current_time, username, usage['cpu'], usage['ram']))
    
    conn.commit()
    conn.close()

if __name__ == "__main__":
    collect_user_usage()

四、基于系统工具的替代方案

若不想自行开发监控,可配置sar工具按用户维度记录数据:

  1. 安装sar:sudo apt install sysstat
  2. 修改/etc/default/sysstat,将ENABLED="false"改为ENABLED="true"
  3. 编辑/etc/cron.d/sysstat,调整采集参数加入用户维度的CPU(-u)和内存(-r)统计
  4. 之后用Python调用sar命令(如sar -u -f /var/log/sysstat/saXX,XX为日期),通过字符串解析提取目标用户的数据。

内容的提问来源于stack exchange,提问作者m.taheri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:40:33