Loading

系统进程管理方法

一、概要

  获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socker连接、线程数等,这些

信息可以呈现出指定进程是否存活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。

官方资料:https://pypi.org/project/psutil/#downloads

二、进程信息

使用pstuil.pids()方法获取所有的进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息,示例如下:

>>> import psutil
>>> psutil.pids()          #列出所有进程PID
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 45, 46, 48, 49, 50, 82, 83, 114, 250, 252, 259, 260, 261, 364, 365, 444, 593, 672, 761, 791, 792, 841, 1033, 1076, 1138, 1160, 1226, 1259, 1487, 1610, 1618, 1619, 1624, 1637, 1639, 1641, 1643, 1645, 1647, 1648, 1650, 1710]
>>> p = psutil.Process(1710)       #实例化一个Process对象,参数为一进程PID
>>> p.name()           #进程名
'python'
>>> p.exe()              #进程bin路径
'/usr/local/bin/python3.6'
>>> p.cwd()             #进程工作目录绝对路径
'/root'
>>> p.status()          #进程状态
'running'
>>> p.create_time()       #进程创建时间,时间戳格式
1527070301.72
>>> p.uids()                  #进程uid信息
puids(real=0, effective=0, saved=0)
>>> p.gids()                  #进程gid信息
pgids(real=0, effective=0, saved=0)
>>> p.cpu_times()         #进程CPU时间信息,包括user、system两个CPU时间
pcputimes(user=0.05, system=0.0)
>>> p.cpu_percent(interval=1.0)
0.0
>>> p.cpu_affinity()    #get进程CPU亲和度,如果设置进程CPU亲和度,将CPU号作为参数即可
[0, 1, 2, 3]
>>> p.cpu_affinity([0, 1])  # set
>>> p.cpu_num()
1
>>> p.memory_percent()     #进程内存利用率    
0.8030976624121613
>>> p.memory_info()        #进程内存rss、vms信息
pmem(rss=8273920, vms=143433728)
>>> p.io_counters()        #进程IO信息,包括读写IO数及字节数
pio(read_count=232, write_count=76, read_bytes=110592, write_bytes=0)
>>> p.connections()    #返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
[pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),
 pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING'),
 pconn(fd=119, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=60759), raddr=addr(ip='72.14.234.104', port=80), status='ESTABLISHED'),
 pconn(fd=123, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=51314), raddr=addr(ip='72.14.234.83', port=443), status='SYN_SENT')]
>>> p.num_threads()  #进程开启线程数
1
>>> p.num_fds()
4
>>> p.threads()
[pthread(id=1710, user_time=0.07, system_time=0.01)]
>>> p.num_ctx_switches()
pctxsw(voluntary=83, involuntary=6)
>>> p.nice()
0
>>> psutil.test()
USER         PID %CPU %MEM     VSZ     RSS TTY           START    TIME  COMMAND
root           1  0.0  0.1   19232    1492 ?             17:53   00:01  init
root           2  0.0    ?       ?       ? ?             17:53   00:00  kthreadd
root           3  0.0    ?       ?       ? ?             17:53   00:00  migration/0
root           4  0.0    ?       ?       ? ?             17:53   00:00  ksoftirqd/0
root           5  0.0    ?       ?       ? ?             17:53   00:00  stopper/0
root           6  0.0    ?       ?       ? ?             17:53   00:00  watchdog/0
.................................

三、popen类的使用

psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态,示例:

>>> import psutil
>>> from subprocess import PIPE
#通过psutil的Popen方法启动的应用程序,可以跟踪程序运行的所以相关信息
>>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE)
>>> p.name()
'python'
>>> p.username()
'root'
>>> p.communicate()
(b'hello\n', None)
>>> p.wait(timeout=2)
0
>>> p.cpu_times()    #得到进程运行的CPU时间
pcputimes(user=0.01, system=0.0)

四、Windows servies

>>> list(psutil.win_service_iter())
[<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,
 <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,
 <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,
 <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,
 ...]
>>> s = psutil.win_service_get('alg')
>>> s.as_dict()
{'binpath': 'C:\\Windows\\System32\\alg.exe',
 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
 'display_name': 'Application Layer Gateway Service',
 'name': 'alg',
 'pid': None,
 'start_type': 'manual',
 'status': 'stopped',
 'username': 'NT AUTHORITY\\LocalService'}

 

posted @ 2018-05-24 20:18  KubeSec  阅读(1059)  评论(0编辑  收藏  举报