系统进程管理方法
一、概要
获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置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'}