首页 > 编程语言 > 详细

Python之psutil模块的使用

时间:2020-01-20 16:22:27      阅读:84      评论:0      收藏:0      [点我收藏+]

1、psutil模块的作用:

psutil是一个开源且跨平台的库,提供获取操作的信息,如cpu、内存、磁盘、网络等信息,psutil还提供了许多命令行工具提供的功能,
包括ps,top,lsof,netstat,ifconfig,who,df,kill,free,nice,ionice,iostat,uptim,pidof,tty,taskset,pmap。非常强大!

 2、psutil模块的安装

pip install psutil

 3、获取CPU常用的信息

import psutil

# 获取CPU常用的信息
print(psutil.cpu_count())  # 获取逻辑的CPU个数
print(psutil.cpu_count(logical=False))  # 获取物理的CPU个数
print(psutil.cpu_percent())  # 获取CPU的利用率
print(psutil.cpu_percent(percpu=True))  # 获取所有逻辑CPU个数的利用率
print(psutil.cpu_percent(percpu=True, interval=2))  # 获取2秒内所有逻辑CPU个数的利用率
print(psutil.cpu_times(percpu=True))  # 查看所有CPU的时间花费
print(psutil.cpu_percent(percpu=True, interval=3))  # 查看3秒内所有CPU的时间花费的比例
print(psutil.cpu_stats())  # 查看CPU上下文切换,中断,软中断,系统调用次数

 4、获取内存常用的信息

import psutil

# 获取内存常用的信息
print(psutil.virtual_memory())  # 查看总内存、可用内存,内存利用率,buffer和cached等,除了内存利用率,其它单位是字节

def byte2human(n):
    """
    字节自动转为可读性强的函数
    :param n:字节数
    :return:
    """
    symbols = (K, M, G, T, P, E, Z, Y)
    prefix = {}
    for i, s in enumerate(symbols):
        prefix[s] = 1 << (i + 1) * 10  # 左位移2位乘10
    for s in reversed(symbols):
        if n >= prefix[s]:  # 只在大于1000的时候,才转换为K
            value = float(n) / prefix[s]
            return %.1f%s % (value, s)
    return %sB % n
result = byte2human(psutil.virtual_memory().total)
print(result)

print(psutil.swap_memory()) #查看虚拟内存的使用情况

 5、获取磁盘的常用信息

import psutil
print(psutil.disk_partitions()) #查看磁盘名称、挂载点、文件系统的类型等信息

def get_disk_via_moutpoint(mountpoint):
    """查看硬盘挂载磁盘"""
    disk = [item for item in psutil.disk_partitions() if item.mountpoint == mountpoint]
    return disk[0].device
result = get_disk_via_moutpoint(C:\\)
print(result)

print(psutil.disk_usage(C:\\))  # 查看硬盘的大小,已使用磁盘容量,空间利用率等
print(psutil.disk_io_counters(perdisk=True))  # 查看每个磁盘的读的次数,写的次数,读字节数,写的字节数等,省去了解析/pro/diskstats文件

 6、获取网络相关的信息

import psutil

# 获取网络相关的信息
print(psutil.net_io_counters()) #获取所有网口的所有流量和包
print(psutil.net_io_counters(pernic=True)) #获取每张网口的流量和包
print(psutil.net_connections())  # 获取每个网络连接的信息
print(psutil.net_if_addrs()) #获取网卡的配置信息
print(psutil.net_if_stats())  # 获取网卡是否启动、通信类型,MTU,传输速度等

 7、其它参数的获取

import psutil
import datetime

print(psutil.users()) # 获取用户登陆信息

print(psutil.boot_time()) #返回启动系统的时间戳
t = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime(%Y-%m-%d %H:%M:%S)
print(t)

8、进程管理常用方法

import psutil
import datetime
import signal

init_process = psutil.Process(11288)  # 获取linux 第一个进程
print(init_process.cmdline())  # 获取启动的程序位置
print(init_process.name())  # 获取进程名字
print(datetime.datetime.fromtimestamp(init_process.create_time()).strftime(%Y-%m-%d %H:%M:%S))  # 获取进程启动时间
print(init_process.num_fds()) #获取文件打开个数
print(init_process.threads()) #获取子进程的个数
print(init_process.is_running())#判断进程是否运行着
init_process.send_signal(signal.SIGKILL)#发送信号给进程
init_process.kill() #发送SIGKILL信号结束进程
init_process.terminate()  # 发送SIGTERM信号结束进程

print(psutil.pids()) #获取正在运行的所在pid
print(psutil.pid_exists(1))  # 判断pid是否存在

# 迭代获取所有的进程对象
for item in psutil.process_iter():
    print(item)

9、获取一台主机的监控信息且发送邮件的示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import datetime
import jinja2
import socket

import psutil
import os
import yamail

def render(tpl_path, *args, **kwargs):
    """渲染html模板"""
    path, filename = os.path.split(tpl_path)
    return jinja2.Environment(
        loader=jinja2.FileSystemLoader(path or ./)
    ).get_template(filename).render(**kwargs)

def byte2human(n):
    """
    字节自动转为可读性强的函数
    :param n:字节数
    :return:
    """
    symbols = (K, M, G, T, P, E, Z, Y)
    prefix = {}
    for i, s in enumerate(symbols):
        prefix[s] = 1 << (i + 1) * 10  # 左位移2位乘10
    for s in reversed(symbols):
        if n >= prefix[s]:  # 只在大于1000的时候,才转换为K
            value = float(n) / prefix[s]
            return %.1f%s % (value, s)
    return %sB % n

def get_cpu_info():
    """获取CPU个数和1秒内CPU的利用率"""
    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 = byte2human(virtual_mem.total)  # 总内存大小
    mem_percent = virtual_mem.percent  # 内存的使用率

    mem_free = byte2human(virtual_mem.free)  # 未使用内存
    mem_used = byte2human(virtual_mem.total * (virtual_mem.percent / 100))  # 使用内存
    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(C:\\)
    disk_total = byte2human(disk_usage.total)  # 硬盘总大小
    disk_percent = disk_usage.percent  # 硬盘的使用率
    disk_free = byte2human(disk_usage.free)  # 硬盘未使用大小
    disk_used = byte2human(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.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_disk_info())
    data.update(get_memory_info())
    return data

if __name__ == __main__:
    email_username = xxx@qq.com
    email_password = ‘xxxx
    smtp_ip = smtp.ym.163.com

    RECV_EMAIL = [xxx@qq.com]

    hostname = socket.gethostname()
    data = collect_monitor_data()
    data.update(hostname=hostname)

    content = render(index.html, **data)

    with yamail.SMTP(email_username, email_password, host=smtp_ip, port=465) as yag:
        for to_email in RECV_EMAIL:
            yag.send(to_email, subject=监控信息, contents=content)

 测试效果

 技术分享图片

Python之psutil模块的使用

原文:https://www.cnblogs.com/ygbh/p/12216123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!