zoukankan      html  css  js  c++  java
  • 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进制转换函数

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

  • 相关阅读:
    【LeetCode每日一题】2020.6.28 209. 长度最小的子数组
    【《你不知道的JS(中卷①)》】三、原生函数
    【《你不知道的JS(中卷①)》】二、值
    【《你不知道的JS(中卷①)》】一、类型
    【LeetCode每日一题】2020.6.26 面试题 02.01. 移除重复节点
    【LeetCode周赛】第194场周赛
    【LeetCode每日一题】2020.6.25 139. 单词拆分
    ios网络编程(HTTP socket)
    objective c 代码块blocks完整总结二
    objective c 代码块blocks完整总结一
  • 原文地址:https://www.cnblogs.com/zydev/p/8729125.html
Copyright © 2011-2022 走看看