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进制转换函数
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
#!/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
<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,收到邮件