Python使用psutil實(shí)現(xiàn)系統(tǒng)監(jiān)控與資源管理
在系統(tǒng)運(yùn)維、資源監(jiān)控、性能分析、服務(wù)狀態(tài)診斷等領(lǐng)域,開發(fā)者常常需要獲取操作系統(tǒng)底層信息,如 CPU 使用率、內(nèi)存占用、磁盤讀寫、網(wǎng)絡(luò)傳輸、進(jìn)程詳情等。雖然這些功能可以通過 shell 命令實(shí)現(xiàn),如 top、df、ps、iostat 等,但在自動(dòng)化腳本和跨平臺(tái)開發(fā)中,使用 Python 腳本來完成這些任務(wù)更具靈活性和可移植性。
這正是 psutil 的用武之地 —— 一個(gè)功能強(qiáng)大的跨平臺(tái)系統(tǒng)監(jiān)控庫,可以輕松獲取各種系統(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”的縮寫,它是一個(gè) 跨平臺(tái)的系統(tǒng)監(jiān)控庫,用于:
- 獲取 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò) 等系統(tǒng)使用情況
- 管理和獲取 進(jìn)程信息
- 實(shí)現(xiàn)任務(wù)監(jiān)控、資源追蹤和系統(tǒng)健康檢查
- 提供類 Unix ps, top, df, netstat, lsof 等命令的功能接口
它的設(shè)計(jì)初衷是替代用 Python 封裝 shell 命令的繁瑣做法,提供一致、優(yōu)雅、性能優(yōu)異的 API。
二、安裝與基本使用
安裝方式
使用 pip 安裝非常簡(jiǎn)單:
pip install psutil
安裝完成后,幾乎可以立即開始使用,無需額外配置。
快速示例:獲取當(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}%")
五、磁盤信息監(jiān)控
1. 獲取磁盤分區(qū)信息
partitions = psutil.disk_partitions() for p in partitions: print(f"掛載點(diǎn): {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. 實(shí)時(shí)磁盤 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}")
七、進(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"名稱: {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)限才能操作其他用戶的進(jìn)程。
八、構(gòu)建一個(gè)簡(jiǎn)單的系統(tǒng)資源儀表板
你可以使用 psutil + rich 或 psutil + flask/streamlit 構(gòu)建漂亮的圖形或終端儀表盤。下面是一個(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 儀表盤,甚至接入 Grafana、Prometheus 進(jìn)行數(shù)據(jù)上報(bào)。
九、高級(jí)用法與實(shí)踐案例
1. 編寫一個(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ī)器長時(shí)間運(yùn)行狀態(tài)監(jiān)控和可視化分析。
十、總結(jié)與展望
psutil 是一個(gè)非常成熟、穩(wěn)定、文檔完善的 Python 庫,它幾乎可以滿足你對(duì)操作系統(tǒng)資源訪問的一切需求,包括但不限于:
- 任務(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)程、訪問別的用戶進(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?異步之如何啟動(dòng)獲取事件循環(huán)
這篇文章主要為大家介紹了Python?異步之如何啟動(dòng)獲取事件循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03python函數(shù)缺省值與引用學(xué)習(xí)筆記分享
有關(guān)一個(gè)在函數(shù)參數(shù)設(shè)置缺省值與引用的問題,這個(gè)問題是大多數(shù)Pythoner可能會(huì)忽視的問題,作個(gè)筆記,以備后閱,同時(shí)供需要的朋友參考2013-02-02python 實(shí)現(xiàn)體質(zhì)指數(shù)BMI計(jì)算
這篇文章主要介紹了python 實(shí)現(xiàn)體質(zhì)指數(shù)BMI計(jì)算操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05基于python實(shí)現(xiàn)開箱即用的桌面時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了如何基于python實(shí)現(xiàn)開箱一個(gè)即用的桌面時(shí)鐘,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考下2023-12-12python 去除二維數(shù)組/二維列表中的重復(fù)行方法
今天小編就為大家分享一篇python 去除二維數(shù)組/二維列表中的重復(fù)行方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python Request類源碼實(shí)現(xiàn)方法及原理解析
這篇文章主要介紹了Python Request類源碼實(shí)現(xiàn)方法及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08完美處理python與anaconda環(huán)境變量的沖突問題
這篇文章主要介紹了完美處理Python與anaconda環(huán)境變量的沖突問題,對(duì)anaconda感興趣的同學(xué),可以參考下2021-04-04