psutil的使用
psutil是Python中广泛使用的开源项目,其提供了非常多的便利函数来获取操作系统的信息。
此外,还提供了许多命令行工具提供的功能,如ps,top,kill.free,iostat,iotop,pidof,pmap等等。
1. CPU#
1.1 获取逻辑CPU和物理CPU个数。
1.2 查看CPU的利用率
percpu参数获取每个cpu的利用率,默认获取整体cpu利用率。
interval:获取interval时间范围内的cpu利用率。
1.3 以命名元组的形式返回cpu的时间花费
也可以指定percpu参数获取每一个cpu的统计时间
1.4 返回cpu耗费时间的比例
1.5 已命名元组的形式,返回cpu的统计信息,包括上下文切换、中断,软中断及系统调用次数
2. 内存#
这里有一个2进制转换函数
1 2 3 4 5 6 7 8 9 10 | def byte2human(n): symbols = ( 'K' , 'M' , 'G' , 'T' ) prefix = {} for i,s in enumerate (symbols): prefix[s] = 1 << (i + 1 ) * 10 for s in reversed (symbols): if n > = prefix[s]: value = float (n) / prefix[s] return '%.1f%s' % (value, s) return "%sB" % n |
查看swap使用情况
3. 磁盘#
返回已挂载的磁盘
查看磁盘使用情况
查看磁盘IO的统计信息,包括读的次数,写的次数,省略了解析/proc/diskstats
网络情况#
返回包括收发字节数,收发包情况,出错情况与删包情况,与解析/proc/net/dev一样
查看每个网络连接的详细情况
查看网卡配置信息
查看网卡的详细信息,包括是否启动,通信类型,传输速度与mtu
4. 其它#
查看登录用户
查看启动时间
5. psutil的进程管理#
Process对进程类进行了封装,可以该类的方法获取进程的详细信息,或给进程发送信号。
pids以列表形式返回正在运行的进程
pid_exists判断给定的pid是否存在
process_iter迭代当前正在运行的进程
综合案列:#
需求:收集系统的统计信息,并通过邮件发给管理员
monitor.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #!/usr/bin/python # -*- coding: UTF-8 -*- from __future__ import unicode_literals import os import socket from datetime import datetime import jinja2 import yagmail import psutil EMAIL_USER = 'scott@163.com' EMAIL_PASSWORD = '123456' RECIPIENTS = [ 'me@qq.com' ] def render(tpl_path, * * kwargs): path, filename = os.path.split(tpl_path) return jinja2.Environment( loader = jinja2.FileSystemLoader(path or './' ) ).get_template(filename).render( * * kwargs) def bytes2human(n): symbols = ( 'K' , 'M' , 'G' , 'T' , 'P' , 'E' , 'Z' , 'Y' ) prefix = {} for i, s in enumerate (symbols): prefix[s] = 1 << (i + 1 ) * 10 for s in reversed (symbols): if n > = prefix[s]: value = float (n) / prefix[s] return '%.1f%s' % (value, s) return "%sB" % n def get_cpu_info(): cpu_count = psutil.cpu_count() cpu_percent = psutil.cpu_percent(interval = 1 ) return dict (cpu_count = cpu_count, cpu_percent = cpu_percent) def get_memory_info(): virtual_mem = psutil.virtual_memory() mem_total = bytes2human(virtual_mem.total) mem_percent = virtual_mem.percent mem_free = bytes2human( virtual_mem.free + virtual_mem.buffers + virtual_mem.cached) mem_used = bytes2human(virtual_mem.total * virtual_mem.percent) return dict (mem_total = mem_total, mem_percent = mem_percent, mem_free = mem_free, mem_used = mem_used) def get_disk_info(): disk_usage = psutil.disk_usage( '/' ) disk_total = bytes2human(disk_usage.total) disk_percent = disk_usage.percent disk_free = bytes2human(disk_usage.free) disk_used = bytes2human(disk_usage.used) return dict (disk_total = disk_total, disk_percent = disk_percent, disk_free = disk_free, disk_used = disk_used) def get_boot_info(): boot_time = datetime.fromtimestamp( psutil.boot_time()).strftime( "%Y-%m-%d %H:%M:%S" ) return dict (boot_time = boot_time) def collect_monitor_data(): data = {} data.update(get_boot_info()) data.update(get_cpu_info()) data.update(get_memory_info()) data.update(get_disk_info()) return data def main(): hostname = socket.gethostname() data = collect_monitor_data() data.update( dict (hostname = hostname)) content = render( 'monitor.html' , * * data) with yagmail.SMTP(user = EMAIL_USER, password = EMAIL_PASSWORD, host = 'smtp.163.com' , port = 465 ) as yag: for recipient in RECIPIENTS: yag.send( recipient, "监控信息" , content) if __name__ = = '__main__' : main() |
monitor.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | < html > < head >< title >监控信息</ title > < body > < table border="1"> < tr >< td >服务器名称</ td >< td >{{hostname}}</ td ></ tr > < tr >< td >开机时间</ td >< td >{{boot_time}}</ td ></ tr > < tr >< td >cpu个数</ td >< td >{{cpu_count}}</ td ></ tr > < tr >< td >cpu利用率</ td >< td >{{cpu_percent}}</ td ></ tr > < tr >< td >内存总量</ td >< td >{{mem_percent}}</ td ></ tr > < tr >< td >内存利用率</ td >< td >{{mem_total}}</ td ></ tr > < tr >< td >内存已用空间</ td >< td >{{mem_used}}</ td ></ tr > < tr >< td >内存可用空间</ td >< td >{{mem_free}}</ td ></ tr > < tr >< td >磁盘空间总量</ td >< td >{{disk_total}}</ td ></ tr > < tr >< td >磁盘空间利用率</ td >< td >{{disk_percent}}</ td ></ tr > < tr >< td >磁盘已用空间</ td >< td >{{disk_used}}</ td ></ tr > < tr >< td >磁盘可用空间</ td >< td >{{disk_free}}</ td ></ tr > </ table > </ body > </ html > |
运行monitor.py,收到邮件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了