Python psutil 实战开发一个简易系统监控工具在运维自动化、服务器巡检、故障排查和资源告警场景中经常需要快速获取机器的 CPU、内存、磁盘和进程状态。如果只依赖系统命令例如 Linux 下的top、free、df或者 Windows 下的任务管理器自动化能力会比较弱。Python 的psutil库正好解决了这个问题它可以用统一的 Python API 获取跨平台系统信息非常适合用来开发轻量级系统监控脚本。本文会从psutil基础用法开始逐步实现一个可以实时刷新的简易系统监控工具。一、psutil 库介绍psutil是 Python 中常用的系统和进程监控库全称可以理解为 process and system utilities。它可以获取CPU 使用率、CPU 核心数、负载信息内存总量、已用内存、可用内存、使用率磁盘分区、磁盘容量、磁盘使用率网络连接、网卡收发数据当前运行的进程列表、进程 PID、进程名称、CPU 占用、内存占用在运维自动化方向psutil常见用途包括编写服务器巡检脚本定时采集系统资源指标判断服务进程是否存活查找高 CPU 或高内存进程结合日志、邮件、企业微信或钉钉实现告警作为监控 Agent 的基础模块安装方式很简单pipinstallpsutil验证安装importpsutilprint(psutil.cpu_count())如果能够输出 CPU 核心数量说明安装成功。二、获取 CPU 使用率CPU 是系统监控中最核心的指标之一。使用psutil.cpu_percent()可以获取 CPU 使用率。importpsutil cpu_percentpsutil.cpu_percent(interval1)print(fCPU 使用率{cpu_percent}%)这里的interval1表示统计 1 秒内的 CPU 使用情况。也可以获取每个 CPU 核心的使用率importpsutil cpu_per_corepsutil.cpu_percent(interval1,percpuTrue)forindex,percentinenumerate(cpu_per_core,start1):print(fCPU 核心{index}{percent}%)获取 CPU 核心数importpsutil logical_countpsutil.cpu_count(logicalTrue)physical_countpsutil.cpu_count(logicalFalse)print(f逻辑核心数{logical_count})print(f物理核心数{physical_count})在实际运维场景中通常会重点关注整体 CPU 使用率。如果 CPU 长时间超过 80% 或 90%就需要进一步排查是否存在异常进程、流量突增、死循环任务或定时任务集中运行等问题。三、获取内存使用情况内存监控可以使用psutil.virtual_memory()。importpsutil memorypsutil.virtual_memory()print(f内存总量{memory.total})print(f已用内存{memory.used})print(f可用内存{memory.available})print(f内存使用率{memory.percent}%)直接输出字节数不太方便阅读可以封装一个单位转换函数defformat_bytes(size):forunitin[B,KB,MB,GB,TB]:ifsize1024:returnf{size:.2f}{unit}size/1024returnf{size:.2f}PB结合起来importpsutildefformat_bytes(size):forunitin[B,KB,MB,GB,TB]:ifsize1024:returnf{size:.2f}{unit}size/1024returnf{size:.2f}PBmemorypsutil.virtual_memory()print(f内存总量{format_bytes(memory.total)})print(f已用内存{format_bytes(memory.used)})print(f可用内存{format_bytes(memory.available)})print(f内存使用率{memory.percent}%)对服务器来说内存不足可能导致服务响应变慢、进程被系统终止、缓存命中率下降。运维脚本中一般会把内存使用率作为告警条件之一。四、获取磁盘空间磁盘空间可以通过psutil.disk_usage()获取。importpsutil diskpsutil.disk_usage(/)print(f磁盘总量{disk.total})print(f已用空间{disk.used})print(f剩余空间{disk.free})print(f磁盘使用率{disk.percent}%)如果希望查看所有磁盘分区可以使用psutil.disk_partitions()importpsutildefformat_bytes(size):forunitin[B,KB,MB,GB,TB]:ifsize1024:returnf{size:.2f}{unit}size/1024returnf{size:.2f}PBpartitionspsutil.disk_partitions()forpartitioninpartitions:try:usagepsutil.disk_usage(partition.mountpoint)exceptPermissionError:continueprint(f设备{partition.device})print(f挂载点{partition.mountpoint})print(f文件系统{partition.fstype})print(f总空间{format_bytes(usage.total)})print(f已用空间{format_bytes(usage.used)})print(f剩余空间{format_bytes(usage.free)})print(f使用率{usage.percent}%)print(-*40)磁盘监控非常重要。日志目录、数据库目录、上传文件目录如果没有清理策略很容易出现磁盘被写满的问题。一旦磁盘满了常见后果包括服务无法写日志、数据库写入失败、容器启动失败等。五、获取进程信息psutil也可以获取系统中的进程信息。常用方法是psutil.process_iter()。importpsutilforprocessinpsutil.process_iter([pid,name,cpu_percent,memory_percent]):infoprocess.infoprint(fPID{info[pid]}, f名称{info[name]}, fCPU{info[cpu_percent]}%, f内存{info[memory_percent]:.2f}%)在遍历进程时可能遇到权限不足或进程已经退出的问题所以正式脚本中通常要捕获异常importpsutilforprocessinpsutil.process_iter([pid,name,cpu_percent,memory_percent]):try:infoprocess.infoprint(info)except(psutil.NoSuchProcess,psutil.AccessDenied,psutil.ZombieProcess):pass如果要找出 CPU 占用较高的进程可以排序importpsutilimporttime# 第一次调用用于初始化 CPU 统计forprocessinpsutil.process_iter():try:process.cpu_percent(intervalNone)except(psutil.NoSuchProcess,psutil.AccessDenied):passtime.sleep(1)processes[]forprocessinpsutil.process_iter([pid,name,cpu_percent,memory_percent]):try:processes.append(process.info)except(psutil.NoSuchProcess,psutil.AccessDenied,psutil.ZombieProcess):passtop_processessorted(processes,keylambdaitem:item[cpu_percent],reverseTrue)[:5]foritemintop_processes:print(fPID{item[pid]}, f名称{item[name]}, fCPU{item[cpu_percent]}%, f内存{item[memory_percent]:.2f}%)这个功能在排查服务器负载过高时非常有用。可以快速定位是哪个 Python 程序、Java 服务、数据库进程或其他后台任务消耗了大量资源。六、实时刷新系统状态系统监控工具通常不是只执行一次而是每隔几秒刷新一次状态。基本思路如下清空终端屏幕获取 CPU、内存、磁盘、进程信息格式化输出休眠指定秒数循环执行清屏函数可以兼容 Windows、Linux 和 macOSimportosdefclear_screen():os.system(clsifos.namentelseclear)循环刷新importtimewhileTrue:clear_screen()print(系统状态刷新中...)time.sleep(2)为了方便停止程序可以捕获KeyboardInterrupt。用户按Ctrl C时脚本可以优雅退出。try:whileTrue:clear_screen()print(系统状态刷新中...)time.sleep(2)exceptKeyboardInterrupt:print(监控已停止)七、制作一个简易系统监控脚本下面实现一个完整脚本功能包括显示当前时间显示 CPU 核心数和 CPU 使用率显示内存总量、可用内存、内存使用率显示所有磁盘分区空间显示 CPU 占用最高的前 5 个进程每 2 秒自动刷新支持Ctrl C停止这个脚本适合用于入门级服务器巡检也可以继续扩展为告警工具。八、完整代码文件名可以保存为system_monitor.py。importosimporttimefromdatetimeimportdatetimeimportpsutil REFRESH_INTERVAL2TOP_PROCESS_LIMIT5defformat_bytes(size):Convert bytes to a human-readable string.forunitin[B,KB,MB,GB,TB]:ifsize1024:returnf{size:.2f}{unit}size/1024returnf{size:.2f}PBdefclear_screen():os.system(clsifos.namentelseclear)defget_cpu_info():return{logical_count:psutil.cpu_count(logicalTrue),physical_count:psutil.cpu_count(logicalFalse),percent:psutil.cpu_percent(interval1),per_core:psutil.cpu_percent(intervalNone,percpuTrue),}defget_memory_info():memorypsutil.virtual_memory()return{total:memory.total,available:memory.available,used:memory.used,percent:memory.percent,}defget_disk_info():disks[]forpartitioninpsutil.disk_partitions():try:usagepsutil.disk_usage(partition.mountpoint)except(PermissionError,FileNotFoundError):continuedisks.append({device:partition.device,mountpoint:partition.mountpoint,fstype:partition.fstype,total:usage.total,used:usage.used,free:usage.free,percent:usage.percent,})returndisksdefinit_process_cpu_percent():forprocessinpsutil.process_iter():try:process.cpu_percent(intervalNone)except(psutil.NoSuchProcess,psutil.AccessDenied):continuedefget_top_processes(limit5):processes[]forprocessinpsutil.process_iter([pid,name,cpu_percent,memory_percent]):try:infoprocess.info processes.append({pid:info[pid],name:info[name]or,cpu_percent:info[cpu_percent]or0.0,memory_percent:info[memory_percent]or0.0,})except(psutil.NoSuchProcess,psutil.AccessDenied,psutil.ZombieProcess):continuereturnsorted(processes,keylambdaitem:item[cpu_percent],reverseTrue)[:limit]defprint_separator():print(-*80)defprint_system_status():nowdatetime.now().strftime(%Y-%m-%d %H:%M:%S)cpuget_cpu_info()memoryget_memory_info()disksget_disk_info()top_processesget_top_processes(TOP_PROCESS_LIMIT)print(fPython psutil 系统监控工具)print(f刷新时间{now})print_separator()print(CPU 信息)print(f物理核心数{cpu[physical_count]})print(f逻辑核心数{cpu[logical_count]})print(fCPU 总使用率{cpu[percent]}%)print(f各核心使用率{, .join(str(item)%foritemincpu[per_core])})print_separator()print(内存信息)print(f内存总量{format_bytes(memory[total])})print(f已用内存{format_bytes(memory[used])})print(f可用内存{format_bytes(memory[available])})print(f内存使用率{memory[percent]}%)print_separator()print(磁盘信息)fordiskindisks:print(f{disk[device]}f挂载点{disk[mountpoint]}f文件系统{disk[fstype]}f总量{format_bytes(disk[total])}f已用{format_bytes(disk[used])}f剩余{format_bytes(disk[free])}f使用率{disk[percent]}%)print_separator()print(fCPU 占用最高的前{TOP_PROCESS_LIMIT}个进程)print(f{PID:10}{CPU%:10}{MEM%:10}进程名称)forprocessintop_processes:print(f{process[pid]:10}f{process[cpu_percent]:10.1f}f{process[memory_percent]:10.2f}f{process[name]})print_separator()print(f每{REFRESH_INTERVAL}秒刷新一次按 Ctrl C 停止监控)defmain():init_process_cpu_percent()try:whileTrue:clear_screen()print_system_status()time.sleep(REFRESH_INTERVAL)exceptKeyboardInterrupt:print(\n监控已停止)if__name____main__:main()运行脚本python system_monitor.py如果是在 Linux 服务器上也可以使用python3 system_monitor.py运行后终端会每隔 2 秒刷新一次系统状态。九、脚本扩展方向这个脚本只是一个基础版本后续可以继续扩展增加 CPU、内存、磁盘阈值判断超过阈值后发送邮件、钉钉或企业微信告警将监控数据写入 CSV、SQLite、MySQL 或 InfluxDB增加网络流量监控增加指定进程存活检测使用argparse支持命令行参数例如刷新间隔、进程数量、告警阈值配合schedule、cron或 Windows 任务计划程序实现定时巡检封装成 Flask/FastAPI 接口做成 Web 监控面板例如增加一个简单的内存告警判断importpsutil memorypsutil.virtual_memory()ifmemory.percent80:print(f警告当前内存使用率过高已达到{memory.percent}%)再比如检查某个关键进程是否存在importpsutil target_processnginxexistsFalseforprocessinpsutil.process_iter([name]):try:iftarget_process.lower()in(process.info[name]or).lower():existsTruebreakexcept(psutil.NoSuchProcess,psutil.AccessDenied):continueifnotexists:print(f警告进程{target_process}未运行)十、总结psutil是 Python 运维自动化中非常实用的系统监控库。它屏蔽了不同操作系统之间的差异让我们可以用统一的 Python 代码获取 CPU、内存、磁盘和进程信息。本文完成了一个简易系统监控工具核心能力包括使用psutil.cpu_percent()获取 CPU 使用率使用psutil.virtual_memory()获取内存状态使用psutil.disk_usage()和psutil.disk_partitions()获取磁盘空间使用psutil.process_iter()获取进程信息使用循环和清屏实现实时刷新整合为一个完整可运行的系统监控脚本对于 Python 运维自动化学习者来说这类脚本非常适合作为练手项目。它既能帮助理解系统资源指标也能为后续开发巡检工具、告警工具和监控 Agent 打下基础。