如何用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工具按用户维度记录数据:
- 安装
sar:sudo apt install sysstat - 修改
/etc/default/sysstat,将ENABLED="false"改为ENABLED="true" - 编辑
/etc/cron.d/sysstat,调整采集参数加入用户维度的CPU(-u)和内存(-r)统计 - 之后用Python调用
sar命令(如sar -u -f /var/log/sysstat/saXX,XX为日期),通过字符串解析提取目标用户的数据。
内容的提问来源于stack exchange,提问作者m.taheri
相关产品推荐
相关产品推荐

