psutil
用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps
,top
,free
等等。要获取这些系统信息,Python可以通过subprocess
模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。
安装psutil
如果安装了Anaconda,psutil就已经可用了。否则,需要在命令行下通过pip安装:
pip install psutil
温馨提示
如果遇到Permission denied安装失败,请加上sudo重试。
CPU信息
获取CPU信息
>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
4
>>> psutil.cpu_count(logical=False) # CPU物理核心
2
# 2说明是双核超线程, 4则是4核非超线程
统计CPU的用户/系统/空闲时间
>>> psutil.cpu_times()
scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45)
再实现类似top
命令的CPU使用率,每秒刷新一次,累计10次:
>>> for x in range(10):
... print(psutil.cpu_percent(interval=1, percpu=True))
...
[14.0, 4.0, 4.0, 4.0]
[12.0, 3.0, 4.0, 3.0]
[8.0, 4.0, 3.0, 4.0]
[12.0, 3.0, 3.0, 3.0]
[18.8, 5.1, 5.9, 5.0]
[10.9, 5.0, 4.0, 3.0]
[12.0, 5.0, 4.0, 5.0]
[15.0, 5.0, 4.0, 4.0]
[19.0, 5.0, 5.0, 4.0]
[9.0, 3.0, 2.0, 3.0]
进程信息
p = psutil.Process(16031) p.name() #进程名 p.exe() #进程的bin路径 p.cwd() #进程的工作目录绝对路径 p.status() #进程状态 p.create_time() #进程创建时间 p.uids() #进程uid信息 p.gids() #进程的gid信息 p.cpu_times() #进程的cpu时间信息,包括user,system两个cpu信息 p.cpu_affinity() #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好 p.memory_percent() #进程内存利用率 p.memory_info() #进程内存rss,vms信息 p.io_counters() #进程的IO信息,包括读写IO数字及参数 p.connectios() #返回进程列表 p.num_threads() #进程开启的线程数 听过psutil的Popen方法启动应用程序,可以跟踪程序的相关信息 from subprocess import PIPE p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE) p.name() p.username()
全部进程
for pnum in psutil.pids(): p = psutil.Process(pnum) print(u"进程名 %-20s 内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s "
% (p.name(), p.memory_percent(), p.status(), p.create_time()))
内存信息
free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2)) total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2)) memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total) print(u"物理内存: %s G" % total) print(u"剩余物理内存: %s G" % free) print(u"物理内存使用率: %s %%" % int(memory * 100))
系统启动时间
print(u"系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))
系统用户
users_count = len(psutil.users())
users_list = ",".join([u.name for u in psutil.users()]) print(u"当前有%s个用户,分别是 %s" % (users_count, users_list))
网卡信息
net = psutil.net_io_counters() bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024) bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024) print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent))
磁盘信息
io = psutil.disk_partitions()
print("系统磁盘信息:" + str(io))
for i in io: o = psutil.disk_usage(i.device) print("总容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G") print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G") print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")
脚本
'''
Author:淘小欣
blog:https://blog.taoxiaoxin.club/
script_info:检测系统硬件脚本
Edition:v0.0.1
'''
# !/usr/bin/env python
# coding:utf-8
import psutil
import datetime
import time
# 当前时间
now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
print(now_time)
# 查看cpu物理个数的信息
print(u"物理CPU个数: %s" % psutil.cpu_count(logical=False))
# cpu的使用率
cpu = (str(psutil.cpu_percent(1))) + '%'
print("cup使用率: %s" % cpu)
# 查看内存信息,剩余内存.free 总共.total
# round()函数方法为返回浮点数x的四舍五入值。
free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
print("物理内存: %s G" % total)
print("剩余物理内存: %s G" % free)
print("物理内存使用率: %s %%" % int(memory * 100))
# 获取系统启动时间
print("系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))
# 获取系统用户
users_count = len(psutil.users())
users_list = ",".join([u.name for u in psutil.users()])
print("当前有%s个用户,分别是 %s" % (users_count, users_list))
# 获取网卡信息,可以得到得到网卡属性,连接数,当前数据等信息
net = psutil.net_io_counters()
bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
print("网卡接收数据 %s 网卡发送数据 %s" % (bytes_rcvd, bytes_sent))
# 获取磁盘数据信息
io = psutil.disk_partitions()
print('-----------------------------磁盘信息---------------------------------------')
for i in io:
try:
o = psutil.disk_usage(i.device)
print("总容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G")
print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G")
print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")
except PermissionError:
continue
print('-----------------------------进程信息-------------------------------------')
# 查看系统全部进程
for pnum in psutil.pids():
p = psutil.Process(pnum)
print(
"进程名 %-20s 内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " % (p.name(), p.memory_percent(), p.status(), datetime.datetime.fromtimestamp(p.create_time()).strftime("%Y-%m-%d %H:%M:%S")))