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进制转换函数

  查看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,收到邮件

 

posted @   头痛不头痛  阅读(489)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
主题色彩