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 相关文章推荐
一个简单的python程序实例(通讯录)
Nov 29 Python
python继承和抽象类的实现方法
Jan 14 Python
收藏整理的一些Python常用方法和技巧
May 18 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
Python占用的内存优化教程
Jul 28 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
python批量处理txt文件的实例代码
Jan 13 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 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获取数组最大值下标的方法
2015/05/12 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
python基础教程之匿名函数lambda
2017/01/17 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python并发编程之线程实例解析
2017/12/27 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
创建市级文明单位实施方案
2014/03/01 职场文书
小学毕业感言100字
2015/07/30 职场文书
家电创业计划书
2019/08/05 职场文书