運維小白也能上手:五分鐘搭建系統資源監控告警神器
在運維中,CPU爆滿、內存溢出、磁盤寫滿是常見問題,輕則服務變慢,重則直接宕機。
這些故障往往不是突然發生,而是資源長期高負載卻沒被發現。
因此,實時監控并主動告警就顯得尤為重要。
Python的psutil庫能輕松獲取系統資源信息,配合一個小腳本,就能快速實現輕量級的自動化監控。

psutil是什么?
psutil 全稱process and system utilities,顧名思義,就是一個用來獲取 系統資源信息 的庫。
它能幫我們輕松拿到:
- CPU 使用情況:使用率、核心數、負載等
- 內存信息:總量、已用、使用率
- 磁盤信息:容量、已用、剩余空間
- 網絡狀態:帶寬流量、連接數
更重要的是:跨平臺支持(Windows、Linux、macOS 全都能用),適合做系統監控和自動化運維。
簡單示例:
import psutil
print("CPU使用率:", psutil.cpu_percent(interval=1), "%")
print("內存使用率:", psutil.virtual_memory().percent, "%")
print("磁盤使用率:", psutil.disk_usage('/').percent, "%")執行結果一目了然,幾行代碼就能搞定系統資源采集。如下圖所示:

為什么要做系統資源監控?
運維中最常見的問題:
- CPU 爆滿 → 服務響應變慢
- 內存溢出 → 進程直接崩潰
- 磁盤寫滿 → 應用無法寫日志、數據庫宕機
這些問題一旦發生,輕則客戶體驗變差,重則系統徹底掛掉。
如果有一個小腳本能幫你:
- 提前預警:在資源用滿前提醒你
- 快速響應:第一時間發告警郵件
- 自動化運維:無需人工盯著,減少巡檢工作
是不是很香???
實現思路
我們的思路非常清晰:
- 采集系統資源信息(用psutil)
- 判斷是否超過閾值(比如 CPU>80% 就報警)
- 觸發告警(通過釘釘發送告警信息)
核心代碼展示
記錄日志功能,方便后續排查錯誤:
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('system_monitor.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)獲取主機和系統資源:
# 閾值配置(百分比)
THRESHOLD = {
"cpu": 80,
"mem": 75,
"disk": 85
}
def get_host_info():
"""獲取主機名和IP"""
try:
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
logger.info(f"獲取主機信息成功: {hostname} ({ip})")
return hostname, ip
except Exception as e:
logger.error(f"獲取主機信息失敗: {e}")
raise
def get_system_info():
"""獲取CPU/內存/磁盤信息"""
try:
cpu_percent = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory()
disk = psutil.disk_usage('/')
system_info = {
"cpu": cpu_percent,
"mem": mem.percent,
"mem_total": round(mem.total / (1024**3), 2),
"mem_used": round(mem.used / (1024**3), 2),
"disk": disk.percent,
"disk_total": round(disk.total / (1024**3), 2),
"disk_used": round(disk.used / (1024**3), 2)
}
logger.info(f"系統資源狀態 - CPU: {system_info['cpu']}%, "
f"內存: {system_info['mem']}%, "
f"磁盤: {system_info['disk']}%")
return system_info
except Exception as e:
logger.error(f"獲取系統信息失敗: {e}")
raise判斷閾值并發送告警:
def monitor():
"""監控并告警"""
try:
logger.info("開始系統監控檢查")
hostname, ip = get_host_info()
info = get_system_info()
alarm_item = []
if info["cpu"] > THRESHOLD["cpu"]:
alarm_item.append(f"- CPU 使用率:{info['cpu']}% > {THRESHOLD['cpu']}%")
if info["mem"] > THRESHOLD["mem"]:
alarm_item.append(f"- 內存使用率:{info['mem']}% > {THRESHOLD['mem']}%")
if info["disk"] > THRESHOLD["disk"]:
alarm_item.append(f"- 磁盤使用率:{info['disk']}% > {THRESHOLD['disk']}%")
if alarm_item: # 有異常才發告警
content = f"""## ?? 系統資源告警
---
### ??? 主機信息
- **主機名**: {hostname}
- **IP地址**: {ip}
- **告警時間**: {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
---
### ?? 異常詳情
{chr(10).join(alarm_item)}
---
### ?? 系統狀態詳情
#### ?? CPU狀態
- **使用率**: {info['cpu']}%
- **狀態**: {"?? 異常" if info["cpu"] > THRESHOLD["cpu"] else "?? 正常"}
#### ?? 內存狀態
- **使用率**: {info['mem']}%
- **使用量**: {info['mem_used']} GB
- **總量**: {info['mem_total']} GB
- **狀態**: {"?? 異常" if info["mem"] > THRESHOLD["mem"] else "?? 正常"}
#### ?? 磁盤狀態
- **使用率**: {info['disk']}%
- **使用量**: {info['disk_used']} GB
- **總量**: {info['disk_total']} GB
- **狀態**: {"?? 異常" if info["disk"] > THRESHOLD["disk"] else "?? 正常"}
---
> ?? *請盡快處理系統資源異常,避免影響業務正常運行*
"""
logger.warning(f"檢測到系統異常,準備發送告警: {alarm_item}")
DingTalkPushUtil().send_md("系統資源告警", content)
else:
logger.info("系統資源正常,無異常項")
except Exception as e:
logger.error(f"監控過程中發生錯誤: {e}")
raise效果預覽
當CPU或內存超過閾值時,你會立刻收到一封告警郵件:

如何自動運行?
寫完腳本只是第一步,真正發揮價值要讓它自動跑起來。
- 在 Linux 下:用 crontab 設置定時任務
- 在 Windows 下:用任務計劃程序定時執行
這樣,你的系統就相當于多了一個“自動巡檢小助手”。下面以linux中的crontab為例
第一步:編輯定時任務
在終端輸入:
crontab -e這會打開當前用戶的定時任務配置文件。
第二步:添加任務
在文件末尾添加一行,指定腳本執行的時間和路徑,例如:
*/5 * * * * /usr/bin/python3 /home/code/monitor/main.py 2>&1解釋一下:
- */5 * * * * → 每 5 分鐘執行一次
- /usr/bin/python3 → Python3 的路徑(可以用 which python3 查看)
- /home/code/monitor/main.py → 你的監控腳本路徑
第三步:檢查任務是否生效
保存退出后,輸入:
crontab -l可以看到剛才添加的任務。
至此,一個自動化的系統資源監控告警就搭建完成。
從 psutil獲取數據 → 腳本判斷閾值 → 釘釘發送告警 → crontab定時執行,這就是一個完整的自動化監控閉環。
總結
- psutil:獲取系統資源神器,跨平臺支持
- DingTalkPushUtil:是自定義封裝的釘釘發送告警工具類
- Python 腳本:讓你從“被動救火”變成“提前預防”
運維的精髓就是:未雨綢繆,少挨老板罵。































