Python psutil 模块详解:系统资源监控与进程管理实战
本文详解Python第三方库psutil的核心用法,涵盖获取CPU、内存、磁盘及网络接口状态的方法。通过实际代码演示如何利用该模块跨平台监控系统指标,并重点讲解安全终止指定进程的正确姿势(含跨平台兼容方案),帮助开发者快速实现系统级运维与性能监控功能。
安装与环境准备
psutil是一个跨平台的进程和系统监控模块,支持Linux、Windows、macOS等主流操作系统。使用前需通过pip安装:
pip install psutil
监控系统资源状态
第一步:获取CPU利用率与核心数
通过cpu_count()可区分逻辑核心与物理核心,cpu_percent()能实时返回CPU负载率。示例代码如下:
>>> import psutil
>>>> psutil.cpu_count() # 逻辑核心数
4
>>>> psutil.cpu_count(logical=False) # 物理核心数
2
# 物理2核+超线程产生4逻辑核
>>>> psutil.cpu_times()
scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45)
若需类似 top 命令的滚动监控,可配合循环刷新:
>>> for _ in range(10):
... print(psutil.cpu_percent(interval=1, percpu=True))
[14.0, 4.0, 4.0, 4.0]
[12.0, 3.0, 4.0, 3.0]
# ...后续数据依次输出
第二步:采集内存与交换分区
系统物理内存与虚拟交换区可通过以下函数读取,返回值均为字节(int)。代码注释已标注换算逻辑:
>>> mem = psutil.virtual_memory()
>>>> svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688)
# total约8GB,已用约6.7GB,占用率66.6%
>>>> swap = psutil.swap_memory()
>>>> sswap(total=1073741824, used=150732800, free=923009248, percent=14.0)
第三步:检查磁盘分区与IO统计
盘符挂载点、容量余量及读写计数是磁盘健康度评估的关键:
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/disk1', mountpoint='/', fstype='hfs', opts='rw,...')]
>>>> psutil.disk_usage('/')
sdiskusage(total=998982549504, used=390880133120, free=607840272384, percent=39.1)
# 总容量约930GB,已用39.1%,文件系统支持日志(journaled)
>>>> psutil.disk_io_counters()
sdiskio(read_count=988513, write_count=274457, read_bytes=..., write_bytes=...)
第四步:读取网络接口与流量计数器
网络收发包统计及接口属性可查看通信活跃度:
>>> psutil.net_io_counters()
snetio(bytes_sent=3885744870, bytes_recv=10357676702, packets_sent=..., packets_recv=...)
>>>> psutil.net_if_addrs()
{'en1': [snic(family=, address='10.0.1.80', netmask='255.255.255.0')]}
>>>> psutil.net_if_stats()
{'en1': snicstats(isup=True, duplex=, speed=0, mtu=1500)}
注意:获取活跃网络连接net_connections()需要管理员权限。普通用户运行会抛出AccessDenied。在终端使用sudo python3重新进入交互环境即可正常获取:
$ sudo python3
Password: ******
>> import psutil
>> psutil.net_connections()
[sconn(fd=83, family=, type=1, laddr=..., raddr=..., status='ESTABLISHED', pid=3725)]
进程管理与信息采集
psutil通过psutil.pids()列出所有进程ID,并结合psutil.Process(pid)对象深入查询单个进程属性:
>>> p = psutil.Process(3776)
>>>> p.name() # 'python3.6'
>>>> p.exe() # '/Users/michael/anaconda3/bin/python3.6'
>>>> p.cwd() # '/Users/michael'
>>>> p.cmdline() # ['python3']
>>>> p.ppid() # 父进程ID 3765
>>>> p.status() # 'running'
>>>> p.username() # 'michael'
>>>> p.memory_info() # pmem(rss=8310784, vms=2481725440)
>>>> p.cpu_times() # pcputimes(user=0.081, system=0.053)
>>>> p.num_threads() # 1
>>>> p.environ() # {'PATH': '/usr/local/bin...', 'LANG': 'zh_CN.UTF-8'}
若想快速预览全系统进程快照,可直接调用内置测试接口,效果近似命令行工具ps aux:
# 需提前使用sudo启动python
>>> psutil.test()
USER PID %MEM VSZ RSS TTY START TIME COMMAND
root 0 24.0 74270628 2016380 ? Nov18 40:51 kernel_task
root 1 0.1 2494140 9484 ? Nov18 01:39 launchd
安全结束指定进程
⚠️ 风险提醒:强制终止进程可能导致数据未保存或依赖服务异常。执行前请确认目标进程非系统关键组件,并建议先备份重要工作文件。
基于psutil的优雅终止(推荐)
该方法遍历进程池,匹配名称后发送终止信号。相比直接kill,它能给予进程清理现场的机会:
import psutil
import os
def kill_process_by_name(process_name: str) -> None:
'''根据进程名查找并终止对应进程'''
for proc in psutil.process_iter(['pid', 'name']):
try:
attrs = proc.as_dict(attrs=['pid', 'name'])
if attrs['name'] == process_name:
parent_pid = proc.parent().ppid()
print(f'发现目标进程: {attrs}')
print(f'父进程PID: {parent_pid}')
# 优雅终止(允许处理SIGTERM信号)
proc.terminate()
# proc.kill() # 若响应超时可改用强制杀掉
break
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
操作系统原生命令回退方案
不同平台对进程控制的实现存在差异,可根据运行环境切换策略:
- Windows环境:推荐使用
subprocess调用系统命令taskkill,参数/f代表强制结束:import subprocess def win_kill(name): cmd = f'taskkill /f /im {name}' subprocess.call(cmd, shell=True) - Unix/Linux/macOS环境:直接使用内置
os.kill发送信号,参数9对应SIGKILL(强制不可拦截):import os def unix_kill(pid): os.kill(pid, 9) print(f"PID {pid} 已被强制终结。")
简要总结
掌握psutil的基础调用后,开发者可轻松构建轻量级系统监控面板或自动化运维脚本。通过合理组合CPU/内存/磁盘/网络API,配合跨平台进程控制逻辑,能够覆盖绝大多数底层资源管理场景。以上就是利用 Python psutil 模块进行系统资源监控与进程管理的详细内容,更多关于 Python 系统级编程与性能优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













