본문으로 바로가기
728x90
 

psutil documentation — psutil 5.7.2 documentation

psutil documentation About psutil (python system and process utilities) is a cross-platform library for retrieving information on running processes and system utilization (CPU, memory, disks, network, sensors) in Python. It is useful mainly for system moni

psutil.readthedocs.io

네트워크 정보 구하기

함수 설명입니다.

  • psutil.net_io_counters() : 패킷의 양(bytes), 패킷, 에러 패킷, 드랍 패킷의 in/out 통계 정보
  • psutil.net_connections() : 시스템 전체 소켓 연결 정보
>>> import psutil
>>>
>>> psutil.net_io_counters()
snetio(bytes_sent=7648826, bytes_recv=110431184, packets_sent=48590, packets_recv=97335, errin=0, errout=0, dropin=0, dropout=0)

 

테스트해보니 누적된 데이터입니다.

어댑터 정보를 열어서 비교해봅니다.

import psutil
from time import sleep

while True:
    net = psutil.net_io_counters()
    sent = round(net.bytes_sent/1024**2, 1)
    recv = round(net.bytes_recv/1024**2, 1)
    print(f'sent: {sent}MB / recv: {recv}MB', end='\r')
    sleep(1)
더보기
sent: 7.4MB / recv: 105.5MB

 

소켓연결정보 입니다.

>>> import psutil
>>> for c in psutil.net_connections():
...     print(c)
...     break
...
sconn(fd=-1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=5202), raddr=addr(ip='127.0.0.1', port=5203), status='ESTABLISHED', pid=15168)

 

연결 상태가 ESTABLISHED 인 항목의 pid, ip, port를 출력해봅니다.

import psutil

conns = psutil.net_connections()
for con in conns:
    if con.status == 'ESTABLISHED':
        print(f'ip: {con.raddr.ip} | port: {con.raddr.port} | pid: {con.pid}')
더보기
ip: 210.103.251.12 | port: 443 | pid: 15168
ip: 211.115.106.206 | port: 80 | pid: 5340
ip: 127.0.0.1 | port: 2290 | pid: 5804
ip: 127.0.0.1 | port: 3095 | pid: 17504
ip: 211.115.106.206 | port: 80 | pid: 5340
ip: 64.233.189.188 | port: 5228 | pid: 12772
ip: 110.76.141.203 | port: 443 | pid: 15168
ip: 127.0.0.1 | port: 2289 | pid: 5804
ip: 117.18.232.200 | port: 443 | pid: 13084
ip: 127.0.0.1 | port: 3094 | pid: 17504
ip: 127.0.0.1 | port: 5202 | pid: 15168
ip: 127.0.0.1 | port: 5203 | pid: 15168
ip: 211.115.106.206 | port: 80 | pid: 5340
ip: 40.90.185.223 | port: 443 | pid: 8144
ip: 40.90.189.152 | port: 443 | pid: 5268

 

pid 를 이용하여 프로세스 이름까지 구해봅니다.

시스템 전체의 프로세스 리스트를 구할 때는 process_iter() 를 사용합니다.

import psutil

net = {}
conns = psutil.net_connections()
for con in conns:
    if con.status == 'ESTABLISHED':
        net.setdefault(con.pid, con.raddr)

procs = psutil.process_iter(['pid', 'name', 'username'])
for p in procs:
    if p.pid in net.keys():
        print(f'pid: {p.pid} | name: {p.name()} | ip: {net[p.pid].ip} | port: {net[p.pid].port}')
더보기
pid: 5268 | name: svchost.exe | ip: 40.90.189.152 | port: 443
pid: 5340 | name: ASDSvc.exe | ip: 211.115.106.208 | port: 80
pid: 5804 | name: Code.exe | ip: 127.0.0.1 | port: 2289
pid: 6240 | name: Code.exe | ip: 111.221.29.254 | port: 443
pid: 8144 | name: svchost.exe | ip: 40.90.185.223 | port: 443
pid: 12772 | name: chrome.exe | ip: 64.233.189.188 | port: 5228
pid: 15168 | name: KakaoTalk.exe | ip: 210.103.251.12 | port: 443
pid: 17504 | name: Code.exe | ip: 127.0.0.1 | port: 3095

 

작업관리자(네트워크) 구현하기

psutil.net_io_counters() 를 활용해서 실시간 I/O 를 구현해봅니다. (싱크..)