Python使用psutil實現(xiàn)系統(tǒng)監(jiān)控與資源管理
在系統(tǒng)運維、資源監(jiān)控、性能分析、服務(wù)狀態(tài)診斷等領(lǐng)域,開發(fā)者常常需要獲取操作系統(tǒng)底層信息,如 CPU 使用率、內(nèi)存占用、磁盤讀寫、網(wǎng)絡(luò)傳輸、進程詳情等。雖然這些功能可以通過 shell 命令實現(xiàn),如 top、df、ps、iostat 等,但在自動化腳本和跨平臺開發(fā)中,使用 Python 腳本來完成這些任務(wù)更具靈活性和可移植性。
這正是 psutil 的用武之地 —— 一個功能強大的跨平臺系統(tǒng)監(jiān)控庫,可以輕松獲取各種系統(tǒng)資源狀態(tài)和進程信息,且支持 Linux、Windows、macOS 等平臺。
本文將深入講解 psutil 的各項功能,并結(jié)合實際代碼示例,展示如何用 Python 構(gòu)建自己的系統(tǒng)監(jiān)控工具、資源分析器、進程管理腳本等。
一、psutil 簡介
psutil 是“process and system utilities”的縮寫,它是一個 跨平臺的系統(tǒng)監(jiān)控庫,用于:
- 獲取 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò) 等系統(tǒng)使用情況
- 管理和獲取 進程信息
- 實現(xiàn)任務(wù)監(jiān)控、資源追蹤和系統(tǒng)健康檢查
- 提供類 Unix ps, top, df, netstat, lsof 等命令的功能接口
它的設(shè)計初衷是替代用 Python 封裝 shell 命令的繁瑣做法,提供一致、優(yōu)雅、性能優(yōu)異的 API。
二、安裝與基本使用
安裝方式
使用 pip 安裝非常簡單:
pip install psutil
安裝完成后,幾乎可以立即開始使用,無需額外配置。
快速示例:獲取當(dāng)前 CPU 使用率
import psutil print("當(dāng)前 CPU 使用率:", psutil.cpu_percent(interval=1), "%")
cpu_percent() 表示在指定時間間隔內(nèi)(如 1 秒)測量 CPU 總體使用率。
三、CPU 信息監(jiān)控
1. 獲取 CPU 邏輯/物理核心數(shù)
print("物理核心數(shù):", psutil.cpu_count(logical=False)) print("邏輯核心數(shù):", psutil.cpu_count(logical=True))
2. 每個核心的使用率
import time for _ in range(5): usage = psutil.cpu_percent(interval=1, percpu=True) print("每個核心使用率:", usage)
3. 獲取 CPU 時間信息
times = psutil.cpu_times() print(f"user: {times.user}, system: {times.system}, idle: {times.idle}")
這個 API 提供了系統(tǒng)級的 CPU 時間分布。
四、內(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}%")
五、磁盤信息監(jiān)控
1. 獲取磁盤分區(qū)信息
partitions = psutil.disk_partitions() for p in partitions: print(f"掛載點: {p.mountpoint}, 類型: {p.fstype}")
2. 獲取磁盤使用情況
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. 實時磁盤 IO 情況
io = psutil.disk_io_counters() print(f"讀字節(jié): {io.read_bytes / 1024 ** 2:.2f} MB") print(f"寫字節(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}")
七、進程管理
1. 枚舉當(dāng)前所有進程
for proc in psutil.process_iter(['pid', 'name', 'username']): print(proc.info)
2. 獲取指定進程的詳細(xì)信息
p = psutil.Process(1) # PID 1 通常是 init 或 systemd print(f"名稱: {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. 操作進程(終止、掛起、恢復(fù))
p = psutil.Process(1234) p.suspend() # 掛起 p.resume() # 恢復(fù) p.terminate() # 終止
注意:需要管理員權(quán)限或 root 權(quán)限才能操作其他用戶的進程。
八、構(gòu)建一個簡單的系統(tǒng)資源儀表板
你可以使用 psutil + rich 或 psutil + flask/streamlit 構(gòu)建漂亮的圖形或終端儀表盤。下面是一個簡單的終端監(jiān)控:
import psutil import time import os def monitor(): while True: os.system('cls' if os.name == 'nt' else 'clear') print("=== 實時系統(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()
可以擴展為 Web 儀表盤,甚至接入 Grafana、Prometheus 進行數(shù)據(jù)上報。
九、高級用法與實踐案例
1. 編寫一個自動殺死高 CPU 占用進程的守護腳本
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 進程: {proc.info}") psutil.Process(proc.info['pid']).terminate() except (psutil.NoSuchProcess, psutil.AccessDenied): continue
2. 跨平臺性能分析工具
你可以用 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")
可用于機器長時間運行狀態(tài)監(jiān)控和可視化分析。
十、總結(jié)與展望
psutil 是一個非常成熟、穩(wěn)定、文檔完善的 Python 庫,它幾乎可以滿足你對操作系統(tǒng)資源訪問的一切需求,包括但不限于:
- 任務(wù)管理器替代腳本
- DevOps 運維工具
- 系統(tǒng)性能分析
- 自動化測試平臺
- AI 訓(xùn)練任務(wù)資源調(diào)度
優(yōu)勢:
- 跨平臺支持強(Windows/Linux/macOS)
- API 直觀、結(jié)構(gòu)清晰
- 文檔豐富、社區(qū)活躍
- 可集成至各種 Python 工具鏈中
注意事項:
- 某些操作(如殺死進程、訪問別的用戶進程)可能需要管理員權(quán)限
- 大量遍歷系統(tǒng)進程時注意異常處理(AccessDenied, NoSuchProcess)
到此這篇關(guān)于Python使用psutil實現(xiàn)系統(tǒng)監(jiān)控與資源管理的文章就介紹到這了,更多相關(guān)Python psutil監(jiān)控系統(tǒng)與資源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)的網(wǎng)頁截圖功能【PyQt4與selenium組件】
這篇文章主要介紹了Python實現(xiàn)的網(wǎng)頁截圖功能,結(jié)合實例形式分別描述了使用PyQt4組件與selenium組件進行網(wǎng)頁截圖操作的相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下2018-07-07Python讀取英文文件并記錄每個單詞出現(xiàn)次數(shù)后降序輸出示例
這篇文章主要介紹了Python讀取英文文件并記錄每個單詞出現(xiàn)次數(shù)后降序輸出,涉及Python文件讀取、字符串替換、分割以及字典遍歷、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06深入探究PyTorch核心特性之自動求導(dǎo)和優(yōu)化
在你已經(jīng)掌握了如何使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,接下來我們將深入探討PyTorch的兩個核心特性:自動求導(dǎo)(Autograd)和優(yōu)化(Optimization),這兩個特性在深度學(xué)習(xí)模型的訓(xùn)練過程中起著至關(guān)重要的作用,感興趣的同學(xué)一起來看看吧2023-07-07