Python使用psutil實(shí)現(xiàn)系統(tǒng)監(jiān)控與資源管理
在系統(tǒng)運(yùn)維、資源監(jiān)控、性能分析、服務(wù)狀態(tài)診斷等領(lǐng)域,開(kāi)發(fā)者常常需要獲取操作系統(tǒng)底層信息,如 CPU 使用率、內(nèi)存占用、磁盤(pán)讀寫(xiě)、網(wǎng)絡(luò)傳輸、進(jìn)程詳情等。雖然這些功能可以通過(guò) shell 命令實(shí)現(xiàn),如 top、df、ps、iostat 等,但在自動(dòng)化腳本和跨平臺(tái)開(kāi)發(fā)中,使用 Python 腳本來(lái)完成這些任務(wù)更具靈活性和可移植性。
這正是 psutil 的用武之地 —— 一個(gè)功能強(qiáng)大的跨平臺(tái)系統(tǒng)監(jiān)控庫(kù),可以輕松獲取各種系統(tǒng)資源狀態(tài)和進(jìn)程信息,且支持 Linux、Windows、macOS 等平臺(tái)。
本文將深入講解 psutil 的各項(xiàng)功能,并結(jié)合實(shí)際代碼示例,展示如何用 Python 構(gòu)建自己的系統(tǒng)監(jiān)控工具、資源分析器、進(jìn)程管理腳本等。
一、psutil 簡(jiǎn)介
psutil 是“process and system utilities”的縮寫(xiě),它是一個(gè) 跨平臺(tái)的系統(tǒng)監(jiān)控庫(kù),用于:
- 獲取 CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò) 等系統(tǒng)使用情況
- 管理和獲取 進(jìn)程信息
- 實(shí)現(xiàn)任務(wù)監(jiān)控、資源追蹤和系統(tǒng)健康檢查
- 提供類(lèi) Unix ps, top, df, netstat, lsof 等命令的功能接口
它的設(shè)計(jì)初衷是替代用 Python 封裝 shell 命令的繁瑣做法,提供一致、優(yōu)雅、性能優(yōu)異的 API。
二、安裝與基本使用
安裝方式
使用 pip 安裝非常簡(jiǎn)單:
pip install psutil
安裝完成后,幾乎可以立即開(kāi)始使用,無(wú)需額外配置。
快速示例:獲取當(dāng)前 CPU 使用率
import psutil
print("當(dāng)前 CPU 使用率:", psutil.cpu_percent(interval=1), "%")
cpu_percent() 表示在指定時(shí)間間隔內(nèi)(如 1 秒)測(cè)量 CPU 總體使用率。
三、CPU 信息監(jiān)控
1. 獲取 CPU 邏輯/物理核心數(shù)
print("物理核心數(shù):", psutil.cpu_count(logical=False))
print("邏輯核心數(shù):", psutil.cpu_count(logical=True))
2. 每個(gè)核心的使用率
import time
for _ in range(5):
usage = psutil.cpu_percent(interval=1, percpu=True)
print("每個(gè)核心使用率:", usage)
3. 獲取 CPU 時(shí)間信息
times = psutil.cpu_times()
print(f"user: {times.user}, system: {times.system}, idle: {times.idle}")
這個(gè) API 提供了系統(tǒng)級(jí)的 CPU 時(shí)間分布。
四、內(nèi)存信息監(jiān)控
1. 獲取虛擬內(nèi)存使用情況
mem = psutil.virtual_memory()
print(f"總內(nèi)存: {mem.total / 1024 ** 3:.2f} GB")
print(f"已使用: {mem.used / 1024 ** 3:.2f} GB")
print(f"空閑: {mem.available / 1024 ** 3:.2f} GB")
print(f"使用率: {mem.percent}%")
2. 獲取 swap 交換分區(qū)信息
swap = psutil.swap_memory()
print(f"Swap 總量: {swap.total / 1024 ** 3:.2f} GB")
print(f"使用率: {swap.percent}%")
五、磁盤(pán)信息監(jiān)控
1. 獲取磁盤(pán)分區(qū)信息
partitions = psutil.disk_partitions()
for p in partitions:
print(f"掛載點(diǎn): {p.mountpoint}, 類(lèi)型: {p.fstype}")
2. 獲取磁盤(pán)使用情況
usage = psutil.disk_usage('/')
print(f"總空間: {usage.total / 1024 ** 3:.2f} GB")
print(f"已用: {usage.used / 1024 ** 3:.2f} GB")
print(f"剩余: {usage.free / 1024 ** 3:.2f} GB")
3. 實(shí)時(shí)磁盤(pán) IO 情況
io = psutil.disk_io_counters()
print(f"讀字節(jié): {io.read_bytes / 1024 ** 2:.2f} MB")
print(f"寫(xiě)字節(jié): {io.write_bytes / 1024 ** 2:.2f} MB")
六、網(wǎng)絡(luò)信息監(jiān)控
1. 獲取網(wǎng)絡(luò) IO 情況
net = psutil.net_io_counters()
print(f"發(fā)送: {net.bytes_sent / 1024 ** 2:.2f} MB")
print(f"接收: {net.bytes_recv / 1024 ** 2:.2f} MB")
2. 獲取網(wǎng)卡信息
addrs = psutil.net_if_addrs()
for iface, infos in addrs.items():
print(f"\n網(wǎng)卡: {iface}")
for info in infos:
print(f" 地址: {info.address} ({info.family})")
3. 當(dāng)前網(wǎng)絡(luò)連接
conns = psutil.net_connections(kind='inet')
for conn in conns[:5]:
print(f"連接: {conn.laddr} -> {conn.raddr}, 狀態(tài): {conn.status}")
七、進(jìn)程管理
1. 枚舉當(dāng)前所有進(jìn)程
for proc in psutil.process_iter(['pid', 'name', 'username']):
print(proc.info)
2. 獲取指定進(jìn)程的詳細(xì)信息
p = psutil.Process(1) # PID 1 通常是 init 或 systemd
print(f"名稱(chēng): {p.name()}")
print(f"路徑: {p.exe()}")
print(f"狀態(tài): {p.status()}")
print(f"CPU使用率: {p.cpu_percent(interval=1.0)}")
print(f"內(nèi)存使用: {p.memory_info().rss / 1024 ** 2:.2f} MB")
3. 操作進(jìn)程(終止、掛起、恢復(fù))
p = psutil.Process(1234) p.suspend() # 掛起 p.resume() # 恢復(fù) p.terminate() # 終止
注意:需要管理員權(quán)限或 root 權(quán)限才能操作其他用戶(hù)的進(jìn)程。
八、構(gòu)建一個(gè)簡(jiǎn)單的系統(tǒng)資源儀表板
你可以使用 psutil + rich 或 psutil + flask/streamlit 構(gòu)建漂亮的圖形或終端儀表盤(pán)。下面是一個(gè)簡(jiǎn)單的終端監(jiān)控:
import psutil
import time
import os
def monitor():
while True:
os.system('cls' if os.name == 'nt' else 'clear')
print("=== 實(shí)時(shí)系統(tǒng)資源監(jiān)控 ===")
print(f"CPU 使用率: {psutil.cpu_percent()}%")
mem = psutil.virtual_memory()
print(f"內(nèi)存: {mem.used / 1024 ** 3:.2f} GB / {mem.total / 1024 ** 3:.2f} GB ({mem.percent}%)")
net = psutil.net_io_counters()
print(f"網(wǎng)絡(luò): 發(fā)送 {net.bytes_sent / 1024 ** 2:.2f} MB, 接收 {net.bytes_recv / 1024 ** 2:.2f} MB")
time.sleep(1)
if __name__ == "__main__":
monitor()可以擴(kuò)展為 Web 儀表盤(pán),甚至接入 Grafana、Prometheus 進(jìn)行數(shù)據(jù)上報(bào)。
九、高級(jí)用法與實(shí)踐案例
1. 編寫(xiě)一個(gè)自動(dòng)殺死高 CPU 占用進(jìn)程的守護(hù)腳本
def auto_kill(threshold=80):
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
try:
if proc.info['cpu_percent'] > threshold:
print(f"殺死高 CPU 進(jìn)程: {proc.info}")
psutil.Process(proc.info['pid']).terminate()
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
2. 跨平臺(tái)性能分析工具
你可以用 psutil 收集數(shù)據(jù)并記錄日志:
import json
import datetime
def log_stats():
stats = {
"time": str(datetime.datetime.now()),
"cpu": psutil.cpu_percent(),
"mem": psutil.virtual_memory().percent,
"disk": psutil.disk_usage('/').percent,
}
with open("syslog.json", "a") as f:
f.write(json.dumps(stats) + "\n")
可用于機(jī)器長(zhǎng)時(shí)間運(yùn)行狀態(tài)監(jiān)控和可視化分析。
十、總結(jié)與展望
psutil 是一個(gè)非常成熟、穩(wěn)定、文檔完善的 Python 庫(kù),它幾乎可以滿(mǎn)足你對(duì)操作系統(tǒng)資源訪問(wèn)的一切需求,包括但不限于:
- 任務(wù)管理器替代腳本
- DevOps 運(yùn)維工具
- 系統(tǒng)性能分析
- 自動(dòng)化測(cè)試平臺(tái)
- AI 訓(xùn)練任務(wù)資源調(diào)度
優(yōu)勢(shì):
- 跨平臺(tái)支持強(qiáng)(Windows/Linux/macOS)
- API 直觀、結(jié)構(gòu)清晰
- 文檔豐富、社區(qū)活躍
- 可集成至各種 Python 工具鏈中
注意事項(xiàng):
- 某些操作(如殺死進(jìn)程、訪問(wèn)別的用戶(hù)進(jìn)程)可能需要管理員權(quán)限
- 大量遍歷系統(tǒng)進(jìn)程時(shí)注意異常處理(AccessDenied, NoSuchProcess)
到此這篇關(guān)于Python使用psutil實(shí)現(xiàn)系統(tǒng)監(jiān)控與資源管理的文章就介紹到這了,更多相關(guān)Python psutil監(jiān)控系統(tǒng)與資源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?中如何使用requests模塊發(fā)布表單數(shù)據(jù)
requests 庫(kù)是 Python 的主要方面之一,用于創(chuàng)建對(duì)已定義 URL 的 HTTP 請(qǐng)求,本篇文章介紹了 Python requests 模塊,并說(shuō)明了我們?nèi)绾问褂迷撃K在 Python 中發(fā)布表單數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2023-06-06
詳解Python中最常用的10個(gè)內(nèi)置函數(shù)
Python作為一種多用途編程語(yǔ)言,擁有豐富的內(nèi)置函數(shù)庫(kù),這些函數(shù)可以極大地提高開(kāi)發(fā)效率,本文將介紹Python中最常用的10個(gè)內(nèi)置函數(shù),我們將深入了解每個(gè)函數(shù),并提供示例代碼以幫助您更好地理解它們,需要的朋友可以參考下2023-11-11
基于Python開(kāi)發(fā)批量提取Excel圖片的小工具
這篇文章主要為大家詳細(xì)介紹了如何使用Python中的openpyxl庫(kù)開(kāi)發(fā)一個(gè)小工具,可以實(shí)現(xiàn)批量提取Excel圖片,有需要的小伙伴可以參考一下2025-03-03
Python?seaborn?barplot畫(huà)圖案例
這篇文章主要介紹了Python?seaborn?barplot畫(huà)圖案例,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
Python實(shí)現(xiàn)樸素貝葉斯的學(xué)習(xí)與分類(lèi)過(guò)程解析
這篇文章主要介紹了Python實(shí)現(xiàn)樸素貝葉斯的學(xué)習(xí)與分類(lèi)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python在Console下顯示文本進(jìn)度條的方法
Python是一門(mén)與php有點(diǎn)像的編輯語(yǔ)言了,下文來(lái)給各位在利用Python實(shí)現(xiàn)進(jìn)度條了,對(duì)Python在Console下顯示文本進(jìn)度條的方法相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02
python+selenium+PhantomJS抓取網(wǎng)頁(yè)動(dòng)態(tài)加載內(nèi)容
一般我們使用python的第三方庫(kù)requests及框架scrapy來(lái)爬取網(wǎng)上的資源,但是設(shè)計(jì)javascript渲染的頁(yè)面卻不能抓取,此 時(shí),我們使用web自動(dòng)化測(cè)試化工具Selenium+無(wú)界面瀏覽器PhantomJS來(lái)抓取javascript渲染的頁(yè)面,下面實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬取2020-02-02
Python類(lèi)反射機(jī)制使用實(shí)例解析
這篇文章主要介紹了Python類(lèi)反射機(jī)制使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

