作为一个独立开发者或者站长,手头难免有几台服务器。有时候负载突然飙升,磁盘空间被日志撑爆,如果没能及时发现,轻则服务响应变慢,重则直接宕机。以前我都是隔三差五手动 SSH 上去敲 top、df -h,后来觉得太麻烦,干脆自己写了个监控脚本,每分钟采集一次数据,超过阈值就通过钉钉机器人发告警。今天就把这个脚本分享出来,代码完整可运行,注释也写得很详细,希望能帮到你。
这个脚本是用 Python 写的,依赖 psutil 库来获取系统信息,用 requests 发送 webhook 告警。你完全可以把它部署在任何 Linux 服务器上(当然 Windows 也能跑,但监控指标需要微调)。
脚本能做什么?
- 每分钟记录 CPU 使用率、内存使用率、磁盘使用率
- 当任意指标超过设定的阈值时,通过钉钉/企业微信/自定义 webhook 发送告警通知
- 默认将记录写入日志文件,方便回溯
- 轻量、易扩展,你可以轻松改成邮件告警或者 Telegram 通知
准备工作
确保服务器上有 Python 3.6+,然后安装依赖:
pip install psutil requests如果你还没有自己的服务器,可以考虑性价比高的云服务商,比如 雨云服务器(优惠码:aabh),新用户有不错的折扣,用来跑脚本正合适。
完整脚本代码
下面直接上代码。我把它命名为 monitor.py,你复制到服务器上,修改开头的配置项就能用。
#!/usr/bin/env python3-- coding: utf-8 --
"""
服务器监控脚本 - 每分钟采集CPU、内存、磁盘使用率,超阈值时通过webhook告警。
Author: Your Name
Date: 2025-03-23
"""
import os
import time
import logging
import psutil
import requests
import json
from datetime import datetime
====== 配置区域 ======
CPU_THRESHOLD = 80 # CPU使用率告警阈值 (%)
MEM_THRESHOLD = 80 # 内存使用率告警阈值 (%)
DISK_THRESHOLD = 90 # 磁盘使用率告警阈值 (%)
INTERVAL = 60 # 采集间隔 (秒)
LOG_FILE = "/var/log/server_monitor.log" # 日志文件路径
WEBHOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" # 钉钉机器人webhook
如果不用钉钉,可以改成其他webhook,或者设为 None 则只记录日志不发送告警。
======================
设置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler(LOG_FILE),
logging.StreamHandler() # 同时在终端输出
]
)
logger = logging.getLogger(__name__)
def send_alert(message):
"""通过webhook发送告警消息,这里以钉钉为例"""
if not WEBHOOK_URL:
logger.warning("未配置webhook,跳过告警发送")
return
try:
payload = {
"msgtype": "text",
"text": {
"content": f"【服务器监控告警】\n{message}"
}
}
headers = {"Content-Type": "application/json"}
resp = requests.post(WEBHOOK_URL, data=json.dumps(payload), headers=headers, timeout=10)
if resp.status_code == 200:
logger.info("告警发送成功")
else:
logger.error(f"告警发送失败: {resp.text}")
except Exception as e:
logger.error(f"发送告警异常: {e}")
def get_system_info():
"""采集系统信息,返回包含CPU、内存、磁盘使用率的字典"""
info = {}
CPU使用率(取5秒内的平均值,避免瞬时波动)
info['cpu_percent'] = psutil.cpu_percent(interval=5)
内存使用率
info['memory_percent'] = psutil.virtual_memory().percent
磁盘使用率(只检查根分区,可根据需要修改)
info['disk_percent'] = psutil.disk_usage('/').percent
return info
def check_thresholds(info):
"""检查各项指标是否超过阈值,返回告警消息列表"""
alerts = []
if info['cpu_percent'] > CPU_THRESHOLD:
alerts.append(f"CPU使用率: {info['cpu_percent']}% (阈值 {CPU_THRESHOLD}%)")
if info['memory_percent'] > MEM_THRESHOLD:
alerts.append(f"内存使用率: {info['memory_percent']}% (阈值 {MEM_THRESHOLD}%)")
if info['disk_percent'] > DISK_THRESHOLD:
alerts.append(f"磁盘使用率: {info['disk_percent']}% (阈值 {DISK_THRESHOLD}%)")
return alerts
def main():
logger.info("服务器监控脚本启动")
while True:
try:
info = get_system_info()
记录日志
log_msg = (f"CPU: {info['cpu_percent']}% | "
f"内存: {info['memory_percent']}% | "
f"磁盘: {info['disk_percent']}%")
logger.info(log_msg)
检查阈值
alerts = check_thresholds(info)
if alerts:
alert_msg = "\n".join(alerts)
logger.warning(f"触发告警:\n{alert_msg}")
send_alert(alert_msg)
else:
logger.debug("一切正常")
except Exception as e:
logger.error(f"采集异常: {e}")
time.sleep(INTERVAL)
if name == "__main__":
main()
如何使用
将代码保存为 monitor.py,然后修改配置:
- 阈值:根据你的服务器规格调整
CPU_THRESHOLD、MEM_THRESHOLD、DISK_THRESHOLD。 - 告警方式:脚本默认通过钉钉机器人发送消息。你需要先在钉钉群添加一个自定义机器人,获取 Webhook URL,替换掉
WEBHOOK_URL。如果你用企业微信或其他,修改send_alert函数即可。 - 日志路径:确保
LOG_FILE指向的目录存在且有写入权限。
然后用 Python 直接运行:
python3 monitor.py建议使用 nohup 或 systemd 将其设为后台服务,保证持续运行。例如用 nohup:
nohup python3 monitor.py &用 systemd 管理脚本(推荐)
为了让监控脚本开机自启并在崩溃后自动重启,最好写成 systemd 服务。新建一个服务文件:
sudo vim /etc/systemd/system/server-monitor.service写入以下内容(注意路径替换):
[Unit]
Description=Server Monitor Script
After=network.target
[Service]
ExecStart=/usr/bin/python3 /path/to/monitor.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target然后执行:
sudo systemctl daemon-reload
sudo systemctl enable server-monitor
sudo systemctl start server-monitor这样脚本就会在后台稳定运行,再也不怕意外中断了。
一点扩展想法
这个脚本虽然简单,但已经能满足大部分个人站长的需求。你可以在此基础上增加更多指标,比如网络流量、进程数、磁盘 I/O;也可以改成邮件告警(用 smtplib)或者 Telegram Bot。如果你有多个服务器,可以搭建一个中心化的告警聚合服务,但那是后话了。
另外,如果你不想自己维护监控,也可以直接使用云服务商提供的监控告警功能,比如 雨云服务器 就自带基本的监控面板,不过自己写脚本的好处是完全可控,而且能自定义告警内容。
总结
自己写一个监控脚本并不复杂,核心就是定期采集数据、比较阈值、发送通知。这个 Python 脚本只有不到 100 行,但已经能帮你省下不少手动检查的时间。如果你正被服务器告警困扰,不妨试试这个方案,然后根据自己的需求改一改。如果你有更好的想法,也欢迎留言交流。
最后提醒一句:别忘了定期查看日志文件,确认监控本身在正常工作——你懂的,监控脚本也可能挂掉,所以最好再加一层监控(或者用 systemd 自动重启)。好了,快去试试吧!
评论区: