Python使用psutil获取进程信息的例子
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-2114:53:40'),psutil.Process(pid=1,name='systemd',started='2019-06-2114: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-2114:53:21') >>>p.cwd() Traceback(mostrecentcalllast): File"/usr/lib64/python3.6/site-packages/psutil/_pslinux.py",line1513,inwrapper returnfun(self,*args,**kwargs) File"/usr/lib64/python3.6/site-packages/psutil/_pslinux.py",line1858,incwd returnreadlink("%s/%s/cwd"%(self._procfs_path,self.pid)) File"/usr/lib64/python3.6/site-packages/psutil/_pslinux.py",line213,inreadlink path=os.readlink(path) PermissionError:[Errno13]Permissiondenied:'/proc/1/cwd' Duringhandlingoftheaboveexception,anotherexceptionoccurred: Traceback(mostrecentcalllast): File"",line1,in File"/usr/lib64/python3.6/site-packages/psutil/__init__.py",line828,incwd returnself._proc.cwd() File"/usr/lib64/python3.6/site-packages/psutil/_pslinux.py",line1516,inwrapper raiseAccessDenied(self.pid,self._name) psutil.AccessDenied:psutil.AccessDenied(pid=1,name='systemd')
可以看到psutil跟大部分监控命令一样都是从/proc/1/cwd里获取信息的。
模拟ps
>>>psutil.test() USERPID%MEMVSZRSSNICESTATUSSTARTTIMECMDLINE root10.2123.1M3.8MsleepJun2110:07/usr/lib/systemd/systemd--switched-root--system--deserialize22 root20.00.0B0.0BsleepJun2100:00kthreadd ... len265980.3164.4M6.2MsleepJul0200:00w3mbaidu.com len270500.6168.3M10.2Mrunni10:4500:00python
根据进程名获取pid
>>>forpinpsutil.process_iter(attrs=['pid','name']): ...if'kw'inp.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
forpinpsutil.process_iter(): if'my.cnf'in''.join(p.cmdline()): print(p.pid)
结尾
本文主要讲psutil进程部分,其它的如内存、CPU、磁盘等都没有写到,想详细了解psutil的可以访问psutil的github以获取更多信息。
以上这篇Python使用psutil获取进程信息的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。