Outil de processus informatique, une brève introduction au module psutil

 

Référence de Liao Da: https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984

 

L'écriture de scripts en Python pour simplifier les opérations et la maintenance quotidiennes est une utilisation importante de Python. Sous Linux, il y a beaucoup de commandes du système permet le temps de surveiller l'état de fonctionnement du système, tels que ps, top, freeet ainsi de suite. Pour obtenir ces informations système, Python peut subprocessappeler via le module et obtenir le résultat. Mais cela est très gênant, surtout si vous devez écrire beaucoup de code d'analyse.

Un autre bon moyen d'obtenir des informations système en Python est d'utiliser psutilce module tiers. Comme son nom l'indique, psutil = process and system utilities, il peut non seulement réaliser la surveillance du système via une ou deux lignes de code, mais peut également être utilisé sur toutes les plateformes. Il prend en charge Linux / UNIX / OSX / Windows, etc. Il est indispensable pour les administrateurs système et les partenaires d'exploitation et de maintenance. Modules requis.

Installer psutil

Si Anaconda est installé, psutil est déjà disponible. Sinon, vous devez installer via pip sur la ligne de commande:

$ pip install psutil

Si vous rencontrez un échec d'installation avec autorisation refusée, veuillez ajouter sudo et réessayer.

Obtenir des informations sur le processeur

Obtenons d'abord les informations sur le processeur:

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

Statistiques CPU utilisateur / système / temps d'inactivité:

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

Réimplémentez topl'utilisation du processeur de commandes similaires , en actualisant une fois par seconde, un total de 10 fois:

>>> 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] 

Obtenir des informations sur la mémoire

Utilisez psutil pour obtenir de la mémoire physique et des informations sur la mémoire d'échange, utilisez:

>>> 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) 

La valeur renvoyée est un entier en octets. Comme vous pouvez le voir, la taille totale de la mémoire est de 8589345592 = 8 Go, 7201386496 = 6,7 Go a été utilisé et 66,6% est utilisé.

La taille de la zone d'échange est 1073741824 = 1 Go.

Obtenir des informations sur le disque

Vous pouvez utiliser psutil pour obtenir des informations sur la partition de disque, l'utilisation du disque et les E / S de disque:

>>> 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) 

On peut voir que '/'la capacité totale du disque est de 998982549504 = 930 Go, soit 39,1% utilisé. Le format de fichier est HFS, optsce qui rwsignifie qu'il peut lire et écrire et journaledprend en charge le journal.

Obtenir des informations sur le réseau

psutil peut obtenir des informations sur l'interface réseau et la connexion réseau:

>>> 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(...) } 

Pour obtenir les informations de connexion réseau actuelles, utilisez 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) 

Vous pouvez obtenir une AccessDeniederreur car psutil doit également passer par l'interface système pour obtenir des informations et une autorisation root est requise pour obtenir des informations de connexion réseau. Dans ce cas, vous pouvez quitter l'environnement interactif Python et sudoredémarrer avec:

$ 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) ] 

Obtenir des informations sur le processus

Vous pouvez obtenir des informations détaillées sur tous les processus via 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 <-- 自己把自己结束了 

Semblable à l'obtention d'une connexion réseau, le processus d'obtention d'un utilisateur root nécessite des autorisations root .pyet des sudoautorisations sont requises lors du démarrage de l'environnement interactif ou des fichiers Python .

psutil fournit également une test()fonction qui peut simuler psl'effet de la commande:

$ 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进程,虽然占用的空间不大,但一致上升的数量还是会占用内存。
# Supprimer plus que le processus chromedriver 
    def del_chromedriver (self): 
        pour i dans psutil.process_iter (): 
            essayez: 
                si i.name () == 'chromedriver': 
                    i.terminate () 
            sauf: 
                ...

 Grâce à process_iter, vous pouvez découvrir l'objet de processus plus rapidement, pourquoi devriez-vous ajouter essayer, car mon processus chinois ici aura des erreurs lors de la lecture.

Problème de codage d'octets, pas de temps pour étudier, il suffit d'ignorer l'erreur directement



Je suppose que tu aimes

Origine www.cnblogs.com/sidianok/p/12723388.html
conseillé
Classement