Python使用psutil获取进程信息的例子


Posted in Python onDecember 17, 2019

psutil是什么

psutil是一个能够获取系统信息(包括进程、CPU、内存、磁盘、网络等)的Python模块。主要用来做系统监控,性能分析,进程管理,像glances也是基于psutil写成的。

在不了解这个模块之前,我都是直接用subprocess去直接执行系统命令来取得进程信息,但是这样会多写很多系统命令行。psutil可以让我们更方便地获取进程信息。

psutil获取进程信息

psutil可以获取进程信息,示例如下:

>>> p = psutil.Process(27050)
>>> p
psutil.Process(pid=27050, name='python', started='10:45:29')
>>> p.name() #进程名
'python'
>>> p.exe() #进程的bin路径
'/usr/bin/python3.6'
>>> p.cwd() #进程的工作目录
'/home/len/scripts/python/designmode'
>>> p.cmdline() #执行进程的命令
['python']
>>> p.pid #进程的id
27050
>>> p.ppid() #父进程的id
16586
>>> p.children() #进程的子进程
[]
>>> p.parent() #进程的父进程
psutil.Process(pid=16586, name='bash', started='09:08:15')
>>> p.parents() #进程的所有父进程,可以看到最后是id为1的systemd
[psutil.Process(pid=16586, name='bash', started='09:08:15'), psutil.Process(pid=16585, name='sshd', started='09:08:15'), psutil.Process(pid=16582, name='sshd', started='09:08:14'), psutil.Process(pid=2892, name='sshd', started='2019-06-21 14:53:40'), psutil.Process(pid=1, name='systemd', started='2019-06-21 14:53:21')]
>>> p.status() #进程状态
'running'
>>> p.username() #进程用户名
'len'
>>> p.create_time() #进程创建的时间戳
1564022729.45
>>> p.terminal() #执行进程的终端
'/dev/pts/0'
>>> p.uids() #执行进程的用户id
puids(real=1000, effective=1000, saved=1000)
>>> p.gids() #执行进程的组id
pgids(real=1000, effective=1000, saved=1000)
>>> p.cpu_times() #进程占用的cpu时间
pcputimes(user=0.35, system=0.08, children_user=0.0, children_system=0.0)
>>> p.cpu_percent(interval=1.0) #进程占用的cpu比率
0.0
>>> p.cpu_affinity() #进程cpu亲和度
[0]
>>> p.cpu_num() #进程占用cpu个数
0
>>> p.memory_info() #进程内存信息
pmem(rss=10539008, vms=176517120, shared=3698688, text=4096, lib=0, data=6397952, dirty=0)
>>> p.memory_full_info() #进程完整内存信息
pfullmem(rss=10539008, vms=176517120, shared=3698688, text=4096, lib=0, data=6397952, dirty=0, uss=9244672, pss=9340928, swap=0)
>>> p.memory_percent() #进程占用内存比率
0.5467627733813867
>>> p.threads() #进程的线程
[pthread(id=27050, user_time=0.35, system_time=0.08)]
>>> p.nice() #进程的优先度
0

如果是普通用户,因为权限不够,在获取一些系统进程的信息时可能会报错,如下:

>>> p = psutil.Process(1)
>>> p
psutil.Process(pid=1, name='systemd', started='2019-06-21 14:53:21')
>>> p.cwd()
Traceback (most recent call last):
 File "/usr/lib64/python3.6/site-packages/psutil/_pslinux.py", line 1513, in wrapper
  return fun(self, *args, **kwargs)
 File "/usr/lib64/python3.6/site-packages/psutil/_pslinux.py", line 1858, in cwd
  return readlink("%s/%s/cwd" % (self._procfs_path, self.pid))
 File "/usr/lib64/python3.6/site-packages/psutil/_pslinux.py", line 213, in readlink
  path = os.readlink(path)
PermissionError: [Errno 13] Permission denied: '/proc/1/cwd'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib64/python3.6/site-packages/psutil/__init__.py", line 828, in cwd
  return self._proc.cwd()
 File "/usr/lib64/python3.6/site-packages/psutil/_pslinux.py", line 1516, in wrapper
  raise AccessDenied(self.pid, self._name)
psutil.AccessDenied: psutil.AccessDenied (pid=1, name='systemd')

可以看到psutil跟大部分监控命令一样都是从/proc/1/cwd里获取信息的。

模拟ps

>>> psutil.test()
USER     PID %MEM   VSZ   RSS NICE STATUS START  TIME CMDLINE
root      1  0.2 123.1M  3.8M    sleep Jun21 10:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root      2  0.0  0.0B  0.0B    sleep Jun21 00:00 kthreadd
...
len    26598  0.3 164.4M  6.2M    sleep Jul02 00:00 w3m baidu.com
len    27050  0.6 168.3M  10.2M    runni 10:45 00:00 python

根据进程名获取pid

>>> for p in psutil.process_iter(attrs=['pid', 'name']):
...   if 'kw' in p.info['name']:
...     print(p.info)
... 
{'name': 'kworker/0:0H', 'pid': 5}
{'name': 'kworker/0:1', 'pid': 785}
{'name': 'kworker/0:1H', 'pid': 1063}
{'name': 'kworker/0:2', 'pid': 1306}
{'name': 'kworker/0:0', 'pid': 1828}
{'name': 'kworker/u2:1', 'pid': 15677}
{'name': 'kworker/u2:2', 'pid': 17551}

根据完整进程名获取pid

for p in psutil.process_iter():
  if 'my.cnf' in ' '.join(p.cmdline()):
    print(p.pid)

结尾

本文主要讲psutil进程部分,其它的如内存、CPU、磁盘等都没有写到,想详细了解psutil的可以访问psutil的github以获取更多信息。

以上这篇Python使用psutil获取进程信息的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
python批量修改文件名的实现代码
Sep 01 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
Saltstack快速入门简单汇总
Mar 01 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
Python命令行解析模块详解
Feb 01 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
jupyter notebook指定启动目录的方法
Mar 02 Python
python psutil监控进程实例
Dec 17 #Python
查看端口并杀进程python脚本代码
Dec 17 #Python
python中的线程threading.Thread()使用详解
Dec 17 #Python
PyCharm下载和安装详细步骤
Dec 17 #Python
python实现指定ip端口扫描方式
Dec 17 #Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 #Python
python wxpython 实现界面跳转功能
Dec 17 #Python
You might like
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
php使用GeoIP库实例
2014/06/27 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
Python实现二分查找算法实例
2015/05/26 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
基于Python实现简单学生管理系统
2020/07/24 Python
python之随机数函数的实现示例
2020/12/30 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
应聘美工求职信
2013/11/07 职场文书
财务支持类个人的自我评价
2014/02/14 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
爱牙日活动总结
2014/08/29 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
教师党员个人总结
2015/02/10 职场文书
村官2015年度工作总结
2015/10/14 职场文书
班委竞选稿范文
2015/11/21 职场文书