介紹
我們可以通過top
、free
、iostat
、ps
等命令獲取服務器的內存、CPU、網絡、進程等信息。Python可以通過使用subprocess
模塊去執行命令獲取這些信息,不過需要寫額外的解析代碼。
psutil
庫提供這些系統信息,psutil = process and system utilities
,可以跨平臺使用獲取CPU、內存、磁盤、網絡、傳感器
等信息。
可以通過pip install psutil
來安裝該模塊。
簡單使用
下面代碼可以在windows上運行,也可以在linux上運行
# -*- coding:UTF-8 -*-
"""
psutil使得Python程序獲取系統信息變得易如反掌。
psutil還可以獲取用戶信息、Windows服務等很多有用的系統信息,具體請參考psutil的官網:https://github.com/giampaolo/psutil
"""
import psutil
import os
import sys
from pprint import pprint
# 獲取CPU信息
cpu_ct = psutil.cpu_count()
print("邏輯CPU個數:", cpu_ct)
cpu_pysical_ct = psutil.cpu_count(logical=False)
print("物理CPU個數:", cpu_pysical_ct)
print("根據上面的結果可推出其超線程數是:", int(cpu_pysical_ct / cpu_ct))
cpu_times = psutil.cpu_times()
print("統計CPU的用戶/系統/空閒時間", cpu_times)
# 等價於 top -n 3 -d 5
for i in range(3):
# 獲取CPU使用百分比信息
cpu_percent = psutil.cpu_percent(interval=5, percpu=False)
print(cpu_percent)
# 獲取內存信息
virtual_memory = psutil.virtual_memory()
# 物理內存
print("virtual_memory:", virtual_memory)
swap_memory = psutil.swap_memory()
# 交換內存
print("swap_memory:", swap_memory)
# 獲取磁盤信息
disk_partitions = psutil.disk_partitions()
pprint(disk_partitions)
# 獲取磁盤的使用情況,需要指定磁盤的掛載目錄
disk_usage = psutil.disk_usage("/")
print(disk_usage)
# 獲取磁盤IO統計數據 如果指定perdisk=True則返回每個磁盤的統計數據
disk_io_counters = psutil.disk_io_counters(perdisk=True)
print(disk_io_counters)
# 獲取網絡信息
net_io_counters = psutil.net_io_counters()
# 獲取網絡讀寫字節/包的個數
print(net_io_counters)
# 獲取網絡接口信息
net_if_addrs = psutil.net_if_addrs()
pprint(net_if_addrs)
# 獲取網絡接口狀態
net_if_stats = psutil.net_if_stats()
pprint(net_if_stats)
# 獲取當前網絡連接信息
net_connections = psutil.net_connections()
pprint(net_connections)
# 獲取進程信息
# 返回的是進程id的列表
pids = psutil.pids()
print("當前運行的進程個數:", len(pids))
# 獲取當前進程id
p = psutil.Process(os.getpid())
print("進程名: ", p.name())
print("進程exe絕對路徑: ", p.exe())
print("進程工作目錄: ", p.cwd())
print("進程啓動的命令行: ", p.cmdline())
print("父進程id: ", p.ppid())
print("父進程: ", p.parent())
print("子進程列表: ", p.children(recursive=False))
print("進程狀態: ", p.status())
print("進程所屬用戶: ", p.username())
print("進程啓動時間戳: ", p.create_time())
from datetime import datetime
datetime.fromtimestamp(p.create_time())
# 判斷是linux才查看進程終端,windows上會報錯
if sys.platform == "linux":
print("進程終端: ", p.terminal())
print("進程使用的CPU時間: ", p.cpu_times())
print("進程使用的內存: ", p.memory_info())
# 進程使用的內存: pmem(rss=77926400, vms=1930043392, shared=5652480, text=2482176, lib=0, data=1716023296, dirty=0)
# ============================================================
# | FIELD | DESCRIPTION | AKA | TOP |
# ============================================================
# | rss | resident set size | | RES |
# | vms | total program size | size | VIRT |
# | shared | shared pages (from shared mappings) | | SHR |
# | text | text ('code') | trs | CODE |
# | lib | library (unused in Linux 2.6) | lrs | |
# | data | data + stack | drs | DATA |
# | dirty | dirty pages (unused in Linux 2.6) | dt | |
# ============================================================
print("進程打開的文件: ", p.open_files())
print("進程相關網絡連接: ", p.connections())
print("進程的線程數量: ", p.num_threads())
# 所有線程信息
pprint(p.threads())
print("進程環境變量: ", p.environ())
# 模擬ps效果
psutil.test()
# 結束進程
print("即將自動結束進程")
p.terminate()
進階和參考網址
更多詳細的信息可以參考psutil官網
廖雪峯老師Python教程