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

作者:撸猫者说 时间:2021-11-03 07:29:47 

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以获取更多信息。

来源:https://www.return520.com/posts/32429/

标签:Python,psutil,进程信息
0
投稿

猜你喜欢

  • .net 上传文件前所未有的简单

    2023-07-17 23:20:04
  • ASP内置对象Request和Response用法详解

    2007-09-14 10:35:00
  • Mysql的服务无法启动的1067错误解决

    2012-01-05 19:31:56
  • CSS清除浮动常用方法小结

    2009-07-07 11:59:00
  • DIV+CSS设计时容易犯的一些错误

    2007-11-13 12:42:00
  • Asp教程:Response对象

    2007-10-01 18:08:00
  • 妄想or未来?界面的虚拟现实化

    2010-03-01 12:53:00
  • PyCharm常用配置和常用插件(小结)

    2023-07-21 03:21:17
  • ASP编码问题的深入研究与解决方案(MSDN)

    2007-10-25 11:54:00
  • Python实现企业微信机器人每天定时发消息实例

    2023-09-04 22:08:40
  • php防止SQL注入详解及防范

    2023-07-22 19:25:53
  • js如何读取csv内容拼接成json

    2023-08-13 02:20:14
  • 隐蔽的ASP后门 大家可以查看下

    2010-08-05 21:26:00
  • python删除文件夹下相同文件和无法打开的图片

    2023-03-09 19:26:42
  • 用JAVASCRIPT格式化数字成货币(逗号隔开)

    2008-01-30 12:34:00
  • 有效防止ASP木马上传运行—小知识[网络安全技术]

    2011-03-06 11:15:00
  • PHP Session变量不能传送到下一页的解决方法

    2023-11-15 01:41:29
  • 全兼容的纯CSS级联菜单要点浅析

    2009-06-10 14:42:00
  • XML:OpenSearch 浏览器指定搜索应用

    2010-05-04 19:37:00
  • 通过表单的做为二进制文件上传request.totalbytes提取出上传的二级制数据

    2011-03-16 10:39:00
  • asp之家 网络编程 m.aspxhome.com