Herramienta de proceso informático, una breve introducción al módulo psutil

 

Referencia de Liao Da: https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984

 

Escribir scripts en Python para simplificar la operación y el mantenimiento diarios es un uso importante de Python. En Linux, hay muchos comandos del sistema nos permite tiempo para supervisar el estado de funcionamiento del sistema, tales como ps, top, freey así sucesivamente. Para obtener esta información del sistema, Python puede subprocessllamar a través del módulo y obtener el resultado. Pero esto es muy problemático, especialmente si tiene que escribir mucho código de análisis.

Otra buena forma de obtener información del sistema en Python es usar psutileste módulo de terceros. Como su nombre lo indica, psutil = proceso y utilidades del sistema, no solo puede realizar el monitoreo del sistema a través de una o dos líneas de código, sino que también se puede usar en todas las plataformas. Es compatible con Linux / UNIX / OSX / Windows, etc. Es indispensable para los administradores del sistema y los socios de operación y mantenimiento Módulos requeridos.

Instalar psutil

Si Anaconda está instalado, psutil ya está disponible. De lo contrario, debe instalar a través de pip en la línea de comando:

$ pip install psutil

Si encuentra una falla de instalación de Permiso denegado, agregue sudo e intente nuevamente.

Obtener información de la CPU

Primero obtengamos la información de la CPU:

>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
4 >>> psutil.cpu_count(logical=False) # CPU物理核心 2 # 2说明是双核超线程, 4则是4核非超线程 

Usuario / sistema / tiempo de inactividad de la CPU de estadísticas:

>>> psutil.cpu_times()
scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45) 

Vuelva a implementar topel uso de CPU de comandos similares , actualizando una vez por segundo, un total de 10 veces:

>>> for x in range(10):
... print(psutil.cpu_percent(interval=1, percpu=True)) ... [14.0, 4.0, 4.0, 4.0] [12.0, 3.0, 4.0, 3.0] [8.0, 4.0, 3.0, 4.0] [12.0, 3.0, 3.0, 3.0] [18.8, 5.1, 5.9, 5.0] [10.9, 5.0, 4.0, 3.0] [12.0, 5.0, 4.0, 5.0] [15.0, 5.0, 4.0, 4.0] [19.0, 5.0, 5.0, 4.0] [9.0, 3.0, 2.0, 3.0] 

Obtener información de memoria

Use psutil para obtener memoria física e intercambiar información de memoria, use:

>>> psutil.virtual_memory()
svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688, active=3342192640, inactive=2650341376, wired=1208852480) >>> psutil.swap_memory() sswap(total=1073741824, used=150732800, free=923009024, percent=14.0, sin=10705981440, sout=40353792) 

El valor devuelto es un entero en bytes. Como puede ver, el tamaño total de la memoria es 8589345592 = 8 GB, 7201386496 = 6.7 GB y 66.6%.

El tamaño del área de intercambio es 1073741824 = 1 GB.

Obtener información del disco

Puede usar psutil para obtener la partición del disco, el uso del disco y la información de E / S del disco:

>>> psutil.disk_partitions() # 磁盘分区信息
[sdiskpart(device='/dev/disk1', mountpoint='/', fstype='hfs', opts='rw,local,rootfs,dovolfs,journaled,multilabel')] >>> psutil.disk_usage('/') # 磁盘使用情况 sdiskusage(total=998982549504, used=390880133120, free=607840272384, percent=39.1) >>> psutil.disk_io_counters() # 磁盘IO sdiskio(read_count=988513, write_count=274457, read_bytes=14856830464, write_bytes=17509420032, read_time=2228966, write_time=1618405) 

Se puede ver que '/'la capacidad total del disco es 998982549504 = 930 GB, que es el 39.1% utilizado. El formato de archivo es HFS, lo optsque rwsignifica que puede leer y escribir, y journaledadmite el registro.

Obtener información de la red

psutil puede obtener la interfaz de red y la información de conexión de red:

>>> psutil.net_io_counters() # 获取网络读写字节/包的个数
snetio(bytes_sent=3885744870, bytes_recv=10357676702, packets_sent=10613069, packets_recv=10423357, errin=0, errout=0, dropin=0, dropout=0) >>> psutil.net_if_addrs() # 获取网络接口信息 { 'lo0': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0'), ...], 'en1': [snic(family=<AddressFamily.AF_INET: 2>, address='10.0.1.80', netmask='255.255.255.0'), ...], 'en0': [...], 'en2': [...], 'bridge0': [...] } >>> psutil.net_if_stats() # 获取网络接口状态 { 'lo0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=16384), 'en0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500), 'en1': snicstats(...), 'en2': snicstats(...), 'bridge0': snicstats(...) } 

Para obtener la información de conexión de red actual, use net_connections():

>>> psutil.net_connections()
Traceback (most recent call last):
  ...
PermissionError: [Errno 1] Operation not permitted During handling of the above exception, another exception occurred: Traceback (most recent call last): ... psutil.AccessDenied: psutil.AccessDenied (pid=3847) 

Es posible que reciba un AccessDeniederror porque psutil también necesita pasar por la interfaz del sistema para obtener información, y se requiere permiso de root para obtener información de conexión de red. En este caso, puede salir del entorno interactivo de Python y sudoreiniciar con:

$ sudo python3
Password: ******
Python 3.8 ... on darwin
Type "help", ... for more information.
>>> import psutil
>>> psutil.net_connections()
[
    sconn(fd=83, family=<AddressFamily.AF_INET6: 30>, type=1, laddr=addr(ip='::127.0.0.1', port=62911), raddr=addr(ip='::127.0.0.1', port=3306), status='ESTABLISHED', pid=3725), sconn(fd=84, family=<AddressFamily.AF_INET6: 30>, type=1, laddr=addr(ip='::127.0.0.1', port=62905), raddr=addr(ip='::127.0.0.1', port=3306), status='ESTABLISHED', pid=3725), sconn(fd=93, family=<AddressFamily.AF_INET6: 30>, type=1, laddr=addr(ip='::', port=8080), raddr=(), status='LISTEN', pid=3725), sconn(fd=103, family=<AddressFamily.AF_INET6: 30>, type=1, laddr=addr(ip='::127.0.0.1', port=62918), raddr=addr(ip='::127.0.0.1', port=3306), status='ESTABLISHED', pid=3725), sconn(fd=105, family=<AddressFamily.AF_INET6: 30>, type=1, ..., pid=3725), sconn(fd=106, family=<AddressFamily.AF_INET6: 30>, type=1, ..., pid=3725), sconn(fd=107, family=<AddressFamily.AF_INET6: 30>, type=1, ..., pid=3725), ... sconn(fd=27, family=<AddressFamily.AF_INET: 2>, type=2, ..., pid=1) ] 

Obtener información del proceso

Puede obtener información detallada de todos los procesos a través de psutil:

>>> psutil.pids() # 所有进程ID
[3865, 3864, 3863, 3856, 3855, 3853, 3776, ..., 45, 44, 1, 0] >>> p = psutil.Process(3776) # 获取指定进程ID=3776,其实就是当前Python交互环境 >>> p.name() # 进程名称 'python3.6' >>> p.exe() # 进程exe路径 '/Users/michael/anaconda3/bin/python3.6' >>> p.cwd() # 进程工作目录 '/Users/michael' >>> p.cmdline() # 进程启动的命令行 ['python3'] >>> p.ppid() # 父进程ID 3765 >>> p.parent() # 父进程 <psutil.Process(pid=3765, name='bash') at 4503144040> >>> p.children() # 子进程列表 [] >>> p.status() # 进程状态 'running' >>> p.username() # 进程用户名 'michael' >>> p.create_time() # 进程创建时间 1511052731.120333 >>> p.terminal() # 进程终端 '/dev/ttys002' >>> p.cpu_times() # 进程使用的CPU时间 pcputimes(user=0.081150144, system=0.053269812, children_user=0.0, children_system=0.0) >>> p.memory_info() # 进程使用的内存 pmem(rss=8310784, vms=2481725440, pfaults=3207, pageins=18) >>> p.open_files() # 进程打开的文件 [] >>> p.connections() # 进程相关网络连接 [] >>> p.num_threads() # 进程的线程数量 1 >>> p.threads() # 所有线程信息 [pthread(id=1, user_time=0.090318, system_time=0.062736)] >>> p.environ() # 进程环境变量 {'SHELL': '/bin/bash', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:...', 'PWD': '/Users/michael', 'LANG': 'zh_CN.UTF-8', ...} >>> p.terminate() # 结束进程 Terminated: 15 <-- 自己把自己结束了 

Al igual que para obtener una conexión de red, el proceso para obtener un usuario root requiere permisos de root, .pyy sudose requieren permisos al iniciar el entorno o los archivos interactivos de Python .

psutil también proporciona una test()función que puede simular psel efecto del comando:

$ sudo python3
Password: ******
Python 3.6.3 ... on darwin Type "help", ... for more information. >>> import psutil >>> psutil.test() USER PID %MEM VSZ RSS TTY START TIME COMMAND root 0 24.0 74270628 2016380 ? Nov18 40:51 kernel_task root 1 0.1 2494140 9484 ? Nov18 01:39 launchd root 44 0.4 2519872 36404 ? Nov18 02:02 UserEventAgent root 45 ? 2474032 1516 ? Nov18 00:14 syslogd root 47 0.1 2504768 8912 ? Nov18 00:03 kextd root 48 0.1 2505544 4720 ? Nov18 00:19 fseventsd _appleeven 52 0.1 2499748 5024 ? Nov18 00:00 appleeventsd root 53 0.1 2500592 6132 ? Nov18 00:02 configd


在使用selenium中,经常会有残余的chrome进程,虽然占用的空间不大,但一致上升的数量还是会占用内存。
# Eliminar más que el proceso chromedriver 
    def del_chromedriver (self): 
        for i in psutil.process_iter (): 
            try: 
                if i.name () == 'chromedriver': 
                    i.terminate () 
            excepto: 
                ...

 A través de process_iter, puede encontrar el objeto de proceso más rápidamente, por qué debería agregar try, porque mi proceso chino aquí tendrá errores al leer.

Problema de codificación de bytes, no hay tiempo para estudiar, simplemente ignore el error directamente



Supongo que te gusta

Origin www.cnblogs.com/sidianok/p/12723388.html
Recomendado
Clasificación